属性观察员

属性观察员回应房产价值的变化。

var myProperty = 5 {
    willSet {
        print("Will set to \(newValue). It was previously \(myProperty)")
    }
    didSet {
        print("Did set to \(myProperty). It was previously \(oldValue)")
    }
}
myProperty = 6
// prints: Will set to 6, It was previously 5
// prints: Did set to 6. It was previously 5
  • 设置 myProperty 之前调用 willSet。新值以 newValue 的形式提供,旧值仍可作为 myProperty 使用。
  • 设置 myProperty 调用 didSet。旧值可用作 oldValue,新值现在可用作 myProperty

注意: 在下列情况下不会调用 didSetwillSet

  • 分配初始值
  • 在自己的 didSetwillSet 中修改变量
  • didSetwillSetoldValuenewValue 的参数名称也可以声明为增加可读性:
var myFontSize = 10 {
    willSet(newFontSize) {
        print("Will set font to \(newFontSize), it was \(myFontSize)")
    }
    didSet(oldFontSize) {
        print("Did set font to \(myFontSize), it was \(oldFontSize)")
    }
}

警告: 虽然支持声明 setter 参数名称,但是应该小心不要混淆名称:

  • willSet(oldValue)didSet(newValue) 完全合法,但会使读者对你的代码感到非常困惑。