快速编程:存储属性中的getter/setter

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

如何覆盖Swift中存储属性的setter?

在Obj-C中,我可以覆盖它的setter,但是Swift似乎并不满意用于存储属性的getter / setter。

假设我有一个Card叫做属性的类rank。我不希望客户端给它任何无效值,因此,在Objective-C中,我可以覆盖setRank以便执行额外的检查。但willSet在Swift中似乎没有帮助,因为newValue它是不变的,分配也没有意义,rank因为setter会在循环中调用。

提问于
用户回答回答于

好的。阅读关于SWIFT的Apples文档:

如果将值分配到属性自己的didSet观察者中,则分配的新值将替换刚刚设置的值。

所以你要做的就是:

var rank: Int = 0 {
    didSet {
        // Say 1000 is not good for you and 999 is the maximum you want to be stored there
        if rank >= 1000  {
            rank = 999
        }
    }
}
用户回答回答于

你不能覆盖get/set对于存储的属性,但可以使用属性观察员。willSet/didSet:

var totalSteps: Int = 0 {
    willSet(newTotalSteps) {
        println("About to set totalSteps to \(newTotalSteps)")
    }
    didSet {
        if totalSteps > oldValue  {
            println("Added \(totalSteps - oldValue) steps")
        }
    }
}

默认参数名称为newValuewillSetoldValuedidSet,或者你可以把它们命名为willSet(newTotalSteps)

扫码关注云+社区