Swift 方法中的 class 选项
Swift optionals in class methods
我对 swift 还是比较陌生,所以我在正确语法方面遇到了一些问题。这是我的 class 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 .但是我收到以下错误:
use of unresolved identifier 'self'
我也收到错误
value of optional type 'Int?' must be unwrapped to a value of type
'Int'
我知道我必须使用 !,但我不知道确切的方法和位置,我尝试过 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 的新手,因此值得注意:这应该是一个结构,而不是 class(它是一个没有身份的纯值,任何两个具有相同的属性应该被认为是相同的日期,这就是结构的用途)。你应该小心称呼它 "Date" 因为它与同名的 Foundation 类型冲突。
我对 swift 还是比较陌生,所以我在正确语法方面遇到了一些问题。这是我的 class 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 .但是我收到以下错误:
use of unresolved identifier 'self'
我也收到错误
value of optional type 'Int?' must be unwrapped to a value of type 'Int'
我知道我必须使用 !,但我不知道确切的方法和位置,我尝试过 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 的新手,因此值得注意:这应该是一个结构,而不是 class(它是一个没有身份的纯值,任何两个具有相同的属性应该被认为是相同的日期,这就是结构的用途)。你应该小心称呼它 "Date" 因为它与同名的 Foundation 类型冲突。