天天看點

Swift - 屬性觀察者(willSet與didSet)

屬性觀察者,類似于觸發器。用來監視屬性的除初始化之外的屬性值變化,當屬性值發生改變時可以對此作出響應。有如下特點:

1,不僅可以在屬性值改變後觸發didSet,也可以在屬性值改變前觸發willSet。

2,給屬性添加觀察者必須要聲明清楚屬性類型,否則編譯器報錯。

3,willSet帶一個newValue的參數,表示新的屬性。

4,didSet帶一個oldValue的參數,表示舊的屬性。

5,屬性初始化時,willSet和didSet不會調用。隻有在初始化上下文之外,當設定屬性值時才會調用。

6,即使是設定的值和原來值相同,willSet和didSet也會被調用

示例代碼

import UIKit

class Animal {
    
    // 普通屬性
    var firstName:String = ""
    var lastName:String = ""
    var nickName:String = ""
    
    // 計算類屬性
    var fullName:String
    {
        get
        {
            return "第一次名字:" + firstName + "最後使用的名字:" + lastName + "正在使用的:" + nickName
        }
    }
    
    var age:Int = 0
    {
        willSet
        {
            print("将要設定年齡為:\(newValue)歲")
        }
        
        didSet
        {
            print("年齡從\(oldValue)設定為\(age)")
            if age > 10
            {
                nickName = "John"
            } else {
                nickName = "Jenny"
            }
        }
    }

    func logCurrentAnimalInfo() -> String
    {
//        return "fullName:" + fullName + "age:" + "\(age)"
        return "fullName:\(fullName),age:\(age)"
    }
    
}
           

運作

func actionOne()
    {
        let animle = Animal()
        animle.firstName = "David"
        animle.lastName = "join"
        animle.age = 20
        
        let info = animle.logCurrentAnimalInfo()
        print(info)
    }

将要設定年齡為:20歲
年齡從0設定為20
fullName:第一次名字:David最後使用的名字:join正在使用的:John,age:20