0

我对 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,但这似乎使情况变得更糟。

我也想对方法daysInMonth做同样的事情

4

1 回答 1

2

默认值需要在编译时保持不变。您不能根据其他一些属性来定义它们。您需要在运行时检查它们的值。在您的示例中,这将是:

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 都应该被认为是同一个 Date,这就是结构用于)。并且您应该小心地将其称为“日期”,因为它与同名的 Foundation 类型相冲突。

于 2020-03-23T14:47:03.010 回答