MST

星途 面试题库

面试题:Swift中属性观察者的触发机制及应用场景

请阐述Swift属性观察者(willSet和didSet)在属性值发生变化时的触发机制,并举例说明至少两个实际应用场景。
50.0万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

触发机制

在Swift中,属性观察者 willSetdidSet 用于监控属性值的变化。

  • willSet:在属性值即将被设置时触发。它会接收一个新值作为参数,在旧版Swift中,该参数是可选的,默认名称为 newValue,现在可以自定义参数名,若不指定则默认仍为 newValue
  • didSet:在属性值被设置后触发。它会接收属性之前的值作为参数,默认名称为 oldValue,同样可自定义,若不指定默认是 oldValue

实际应用场景

  1. 日志记录
    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 属性值改变时,willSetdidSet 都会打印相应的日志信息,有助于跟踪属性值的变化。
  2. 数据验证与修正
    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 进行数据验证,如果新值不符合条件(低于绝对零度),则修正属性值。