原創(chuàng)文章粤咪,歡迎轉(zhuǎn)載鲤遥。轉(zhuǎn)載請注明:關(guān)東升的博客
為了監(jiān)聽屬性的變化沐寺,Swift提供了屬性觀察者。屬性觀察者能夠監(jiān)聽存儲屬性的變化盖奈,即便變化前后的值相同混坞,它們也能監(jiān)聽到。
屬性觀察者主要有以下兩個:
??willSet:觀察者在修改之前調(diào)用钢坦。
??didSet:觀察者在修改之后立刻調(diào)用究孕。
屬性觀察者的語法格式如下:
面向?qū)ο箢愋?類型名 {??? ?
??? ...
??? var 存儲屬性: 屬性數(shù)據(jù)類型 = 初始化值 {
??? willSet(新值) {???//定義willSet觀察者〉迹“新值”是傳遞給willSet觀察者的參數(shù)厨诸,它保存了將要替換原來屬性的新值
??????? ...
??? }????????
??? didSet(舊值) {??//定義didSet觀察者『探矗“舊值”是傳遞給didSet觀察者的參數(shù)微酬,它保存了被新屬性替換的舊值。
??????? ...
??? }???????
??? }???????
}?
屬性觀察者的語法格式比計算屬性要混亂颤陶。
屬性觀察者可以在類和結(jié)構(gòu)體中使用得封,不能在枚舉中使用。
示例代碼如下:
class Employee {?
??? var no: Int = 0
??? var name: String = "Tony" {?
??? willSet(newNameValue) {?//定義name屬性的willSet觀察者指郁,newNameValue是由我們分配的傳遞新值的參數(shù)名
??????? print("員工name新值:\(newNameValue)") ?
??? }
??? didSet(oldNameValue) {?//定義name屬性的didSet觀察者忙上,oldNameValue是由我們分配的傳遞舊值的參數(shù)名
??????? print("員工name舊值:\(oldNameValue)")
??? }
??? }
??? var job: String?
??? var salary: Double = 0
??? var dept: Department?
}
struct Department {??
??? var no: Int = 10 {??
??? willSet {????//定義no屬性的willSet觀察者,注意這里沒有聲明參數(shù)闲坎,但是我們可以在觀察者內(nèi)部使用newValue
??????? print("部門編號新值:\(newValue)")
??? }
??? didSet {????//定義no屬性的didSet觀察者疫粥,注意這里也沒有聲明參數(shù),但是我們可以在觀察者內(nèi)部使用oldValue
??????? print("部門編號舊值:\(oldValue)") ??
??? }
??? }
??? var name: String = "RESEARCH"
}
var emp = Employee()
emp.no = 100
emp.name = "Smith"?????
var dept = Department()
dept.no = 30???????
上述代碼運行結(jié)果如下:
員工name新值:Smith
員工name舊值:Tony
部門編號新值:30
部門編號舊值:10