為了監聽屬性的變化,Swift提供了屬性觀察者。屬性觀察者能夠監聽存儲屬性的變化,即便變化前後的值相同,它們也能監聽到。
屬性觀察者主要有以下兩個:
willSet:觀察者在修改之前調用。
didSet:觀察者在修改之後立刻調用。
屬性觀察者的語法格式如下:
面向對象類型類型名 {
...
var 存儲屬性: 屬性數據類型 = 初始化值 {
willSet(新值) { //定義willSet觀察者。“新值”是傳遞給willSet觀察者的參數,它保存了將要替換原來屬性的新值
...
}
didSet(舊值) { //定義didSet觀察者。“舊值”是傳遞給didSet觀察者的參數,它保存了被新屬性替換的舊值。
...
}
}
}
屬性觀察者的語法格式比計算屬性要混亂。
屬性觀察者可以在類和結構體中使用,不能在枚舉中使用。
示例代碼如下:
class Employee {
var no: Int = 0
var name: String = "Tony" {
willSet(newNameValue) { //定義name屬性的willSet觀察者,newNameValue是由我們分配的傳遞新值的參數名
print("員工name新值:\(newNameValue)")
}
didSet(oldNameValue) { //定義name屬性的didSet觀察者,oldNameValue是由我們分配的傳遞舊值的參數名
print("員工name舊值:\(oldNameValue)")
}
}
var job: String?
var salary: Double = 0
var dept: Department?
}
struct Department {
var no: Int = 10 {
willSet { //定義no屬性的willSet觀察者,注意這裡沒有聲明參數,但是我們可以在觀察者內部使用newValue
print("部門編號新值:\(newValue)")
}
didSet { //定義no屬性的didSet觀察者,注意這裡也沒有聲明參數,但是我們可以在觀察者內部使用oldValue
print("部門編號舊值:\(oldValue)")
}
}
var name: String = "RESEARCH"
}
var emp = Employee()
emp.no = 100
emp.name ="Smith"
var dept = Department()
dept.no = 30
上述代碼運行結果如下:
員工name新值:Smith
員工name舊值:Tony
部門編號新值:30
部門編號舊值:10