【发布时间】:2014-07-26 15:32:02
【问题描述】:
假设我需要编写一个 Foobar 类,并满足以下部分要求:
- 它需要一个名为
someProperty的读写属性, -
SomeProperty是一个具有以下约束的整数:- 值必须在
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 进行验证,但不知何故,这似乎是一个杂种。
【问题讨论】:
标签: validation encapsulation getter-setter swift