推荐答案
在 Swift 中,willSet 和 didSet 是属性观察器,用于在属性值即将改变或已经改变时执行特定的代码。它们可以用于存储属性和计算属性(尽管计算属性通常使用 get 和 set 来定义)。
示例代码
var myProperty: Int = 0 {
willSet(newValue) {
print("属性即将改变,新值为 \(newValue)")
}
didSet(oldValue) {
print("属性已经改变,旧值为 \(oldValue),新值为 \(myProperty)")
}
}使用场景
willSet: 在属性值即将改变时调用,可以访问即将设置的新值。didSet: 在属性值已经改变后调用,可以访问旧值。
本题详细解读
willSet 和 didSet 的作用
willSet: 在属性值即将改变时触发。你可以在这个观察器中访问即将设置的新值(通过newValue参数),并执行一些操作,比如验证新值是否合法。didSet: 在属性值已经改变后触发。你可以在这个观察器中访问旧值(通过oldValue参数),并执行一些操作,比如更新 UI 或记录日志。
注意事项
初始化时不触发:
willSet和didSet不会在属性初始化时触发,只有在属性值被修改时才会触发。计算属性的使用: 虽然
willSet和didSet可以用于计算属性,但通常计算属性使用get和set来定义行为。性能考虑: 由于
willSet和didSet在每次属性值改变时都会触发,因此在性能敏感的场景中应谨慎使用。
示例解释
// www.javascriptcn.com code example
var myProperty: Int = 0 {
willSet(newValue) {
print("属性即将改变,新值为 \(newValue)")
}
didSet(oldValue) {
print("属性已经改变,旧值为 \(oldValue),新值为 \(myProperty)")
}
}
myProperty = 10输出结果为:
属性即将改变,新值为 10 属性已经改变,旧值为 0,新值为 10
在这个例子中,当 myProperty 的值从 0 变为 10 时,willSet 和 didSet 分别被触发,并打印出相应的信息。