推荐答案
在 Swift 中,属性观察器(Property Observer)是一种用于监视和响应属性值变化的机制。属性观察器允许你在属性值即将改变或已经改变时执行自定义的代码。Swift 提供了两种属性观察器:willSet 和 didSet。
willSet:在属性值即将被设置之前调用。你可以通过newValue访问即将设置的新值。didSet:在属性值已经被设置之后调用。你可以通过oldValue访问之前的值。
属性观察器适用于存储属性(stored properties),但不适用于计算属性(computed properties)。
本题详细解读
1. willSet 观察器
willSet 观察器在属性值即将被设置之前调用。你可以在 willSet 中访问即将设置的新值,这个新值通过 newValue 关键字来表示。willSet 观察器通常用于在属性值改变之前执行一些准备工作或验证。
var score: Int = 0 {
willSet {
print("即将设置新值: \(newValue)")
}
}
score = 10 // 输出: 即将设置新值: 102. didSet 观察器
didSet 观察器在属性值已经被设置之后调用。你可以在 didSet 中访问之前的值,这个旧值通过 oldValue 关键字来表示。didSet 观察器通常用于在属性值改变之后执行一些清理工作或更新其他相关的属性。
var score: Int = 0 {
didSet {
print("旧值是: \(oldValue), 新值是: \(score)")
}
}
score = 10 // 输出: 旧值是: 0, 新值是: 103. 使用场景
属性观察器非常适合用于以下场景:
- 数据验证:在属性值改变之前或之后进行验证。
- 依赖更新:当一个属性的值改变时,更新其他相关的属性。
- 日志记录:记录属性值的变化历史。
4. 注意事项
- 属性观察器只能在存储属性上使用,不能在计算属性上使用。
- 在初始化方法中设置属性值时,不会触发属性观察器。
- 如果你在
didSet中修改了属性的值,不会再次触发didSet或willSet。
// www.javascriptcn.com code example
var score: Int = 0 {
didSet {
if score > 100 {
score = 100 // 不会再次触发 didSet
}
}
}
score = 150 // 输出: 旧值是: 0, 新值是: 100通过使用属性观察器,你可以在属性值变化时执行自定义的逻辑,从而更好地控制和管理属性的行为。