[英]Swift optionals in class methods
我對 swift 還是比較陌生,所以我在正確的語法上遇到了一些問題。 這是我的Date類的代碼,它具有isLeapYear和daysInMonth方法。 我對這些方法的選項有問題:
class Date {
var day, month, year : Int
init (day : Int, month : Int, year : Int) {
self.day = day
self.month = month
self.year = year
}
func isLeapYear(y : Int? = self.year) -> Bool {
var x = false
if y % 4 == 0 {x = true}
return x
}
//Returns the amount of days in a given month
func daysInMonth(month : Int? = self.month, year : Int? = self.year) -> Int? {
let _31_day_months = [1, 3, 5, 7, 8, 10, 12]
let _30_day_months = [4, 6, 9, 11]
if month == 2 {
if self.isLeapYear(y : year) {return 29} else {return 28}
}
else if _31_day_months.contains(month) {return 31}
else if _30_day_months.contains(month) {return 30}
else {return nil}
}
}
我想用func isLeapYear(y : Int? = self.year) -> Bool
是,當我調用 isLeapYear 並且未指定 y 時,它會自動設置為self.year 。 但是我收到以下錯誤:
使用未解析的標識符“self”
我也收到錯誤
可選類型“Int?”的值必須解包為“Int”類型的值
我知道我必須使用! ,但我不知道具體如何以及在哪里, if y! % 4 == 0
,我已經嘗試過這樣做if y! % 4 == 0
if y! % 4 == 0
,但這似乎讓它變得更糟。
我也想為方法daysInMonth做同樣的事情
默認值需要在編譯時保持不變。 您不能根據某些其他屬性來定義它們。 您需要在運行時檢查它們的值。 在您的示例中,這將是:
func isLeapYear(y : Int? = nil) -> Bool {
var x = false
if (y ?? year) % 4 == 0 {x = true} // <== "?? year" meaning "y, or year if y is nil"
return x
}
請注意,這是一個非常令人困惑的 API。 您必須創建一個隨機Date
實例以檢查與該實例無關的內容。 相反,我相信你在這里真正的意思是兩種方法; 一個靜態的,一個在實例上:
// Static method, called as Year.isLeapYear(xxxx)
static func isLeapYear(_ y: Int) -> Bool {
// Note that this is not the correct Gregorian Leap Year rule
return y % 4 == 0
}
// Instance method, called as year.isLeapYear()
func isLeapYear() -> Bool { Date.isLeapYear(year) }
既然你是 Swift 的新手,那么值得注意的是:這應該是一個結構體,而不是一個類(它是一個沒有身份的純值,任何兩個具有相同屬性的日期都應該被認為是同一個日期,這就是結構用於)。 並且您應該小心地將其稱為“Date”,因為這與同名的 Foundation 類型相沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.