簡體   English   中英

類方法中的 Swift 選項

[英]Swift optionals in class methods

我對 swift 還是比較陌生,所以我在正確的語法上遇到了一些問題。 這是我的Date類的代碼,它具有isLeapYeardaysInMonth方法。 我對這些方法的選項有問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM