如何将属性限制为范围?

时间:2014-06-13 18:17:48

标签: properties swift

在某些情况下,我可能想要将数据建模,将值限制在给定范围内。

例如,如果我想代表一个"哺乳动物",我可能想要将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设置为某个任意值。

有更好的方法吗?

2 个答案:

答案 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的优雅。