属性观察者会观察并对属性值的变化做出回应。每当一个属性的值被设置时,属性观察者都会被调用,即使这个值与该属性当前的值相同。
你可以选择将这些观察者或其中之一定义在属性上:
-
willSet 会在该值被存储之前被调用。
-
didSet 会在一个新值被存储后被调用。
如果你实现了一个 willSet 观察者,新的属性值会以常量形式参数传递。你可以在你的 willSet 实现中为这个参数定义名字。
如果你没有为它命名,那么它会使用默认的名字 newValue 。
同样,如果你实现了一个 didSet观察者,一个包含旧属性值的常量形式参数将会被传递。你 可以为它命名,也可以使用默认的形式参数名 oldValue 。如果你在属性自己的 didSet 观察 者里给自己赋值,你赋值的新值就会取代刚刚设置的值。
注意父类属性的 willSet 和 didSet 观察者会在子类初始化器中设置时被调用。它们不会在类的父类初始化器调用中设置其自身属性时被调用。
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps