想象一下,我需要编写一个Foobar
类,其中包含以下部分要求:
someProperty
,SomeProperty
是一个具有以下约束的Integer:
0
到100
(包含)之内。42
是无效值;如果为SomeProperty
提供了42,则将使用/存储下一个有效值(43
)。如何在Swift中实现?
class Foobar {
var someProperty: Int = 0 {
get {
return someProperty
}
set {
switch newValue {
case 42:
someProperty = 43
case 0...100:
someProperty = newValue
default:
someProperty = 0
}
}
}
}
根据Property getters and setters,这是对setter的错误使用。如果是这样,它将如何编码?我不希望每个呼叫实体都必须验证Foobar。 Foobar应该验证自己(促进封装)。
foobarObject.someProperty = 42 // This is wrong, 42 is an invalid value, but how would Foobar enforce this?
println(foobarObject.someProperty) // Should print `43`, because 42 is invalid and it would use the next valid number
我已经玩弄了didSet
或willSet
进行验证的想法,但不知怎的,这似乎是一个污垢。
答案 0 :(得分:3)
试试这个
class Foobar {
var someProperty: Int = 0 {
didSet {
switch self.someProperty {
case 42:
self.someProperty = 43
case 0...100:
break;
default:
self.someProperty = 0
}
}
}
}
答案 1 :(得分:1)
在Switch语句流程中,尝试添加以下行:
default:
self.someProperty = oldValue
保留旧的有效状态。