在某些情况下,我可能想要将数据建模,将值限制在给定范围内。
例如,如果我想代表一个"哺乳动物",我可能想要将legs
属性限制为0-4。
我的第一次尝试如下所示:
class Mammal {
var _numLegs:Int?
var numLegs:Int {
get {
return _numLegs!
}
set {
if 0...4 ~= newValue {
self._numLegs = newValue
}
else {
self._numLegs = nil
}
}
}
}
然而,这似乎并不令人满意,因为所有的财产都是公共的"没有什么可以阻止班级的客户将Mammal._numLegs
设置为某个任意值。
有更好的方法吗?
答案 0 :(得分:5)
在这种特定情况下,您需要一个property observer
,您可以像这样实现它:
class Mammal {
init () {
numLegs = 0
super.init()
}
var numLegs:Int {
didSet: {
if !(numLegs ~= 0...4) {
numLegs = max(0,min(numLegs,4)) // Not sure if this is what you want though
}
}
}
}
虽然看着这个,但我不确定这是否会再次发送并再次致电didSet
...我想这不会太糟糕,因为它会在第二次通过检查
答案 1 :(得分:5)
为了好玩,我决定用@ jackWu的建议(+1)写一个片段,以便尝试didSet
的事情:
class Mammal {
var numLegs:UInt? {
didSet { if numLegs? > 4 { numLegs = nil } }
}
init() {
numLegs = nil
}
}
完美无缺。一旦你尝试将numLegs设置为5或更大,它就会自动缩小。请注意,我使用Uint来避免负腿数量:)
我非常喜欢didSet
的优雅。