面试题答案
一键面试触发机制
在Swift中,属性观察者 willSet
和 didSet
用于监控属性值的变化。
- willSet:在属性值即将被设置时触发。它会接收一个新值作为参数,在旧版Swift中,该参数是可选的,默认名称为
newValue
,现在可以自定义参数名,若不指定则默认仍为newValue
。 - didSet:在属性值被设置后触发。它会接收属性之前的值作为参数,默认名称为
oldValue
,同样可自定义,若不指定默认是oldValue
。
实际应用场景
- 日志记录
在上述代码中,每次class User { var name: String { willSet { print("即将把名字从 \(name) 改为 \(newValue)") } didSet { print("名字已从 \(oldValue) 改为 \(name)") } } init(name: String) { self.name = name } } let user = User(name: "Alice") user.name = "Bob"
name
属性值改变时,willSet
和didSet
都会打印相应的日志信息,有助于跟踪属性值的变化。 - 数据验证与修正
这里在设置class Temperature { var celsius: Double { willSet { if newValue < -273.15 { print("温度不能低于绝对零度,修正为绝对零度") celsius = -273.15 } } } init(celsius: Double) { self.celsius = celsius } } var temp = Temperature(celsius: -300) print(temp.celsius)
celsius
属性值前,willSet
进行数据验证,如果新值不符合条件(低于绝对零度),则修正属性值。