Swift 中為什么要有 willSet 和 didSet,它們的使用情境是什么?

Swift 擁有類似 C# 的屬性聲明語(yǔ)法:

var foo : int {
    get { return getFoo() }
    set { setFoo(newValue) }
}

但是,Swift 還另有 willSetdidSet 行為。它們分別在調(diào)用 setter 之前和之后被調(diào)用。那它們存在的意義是什么?畢竟考慮到在 setter 里可以寫(xiě)出完全相同的代碼。

其實(shí)關(guān)鍵在于,有時(shí)候我們需要存儲(chǔ)屬性時(shí)自動(dòng)進(jìn)行某些行為,例如通知其它對(duì)象,這個(gè)屬性被改變了。如果只有 get/set,就需要另一個(gè)字段來(lái)保存改動(dòng)之前的值。借助 willSetdidSet,值被修改時(shí)進(jìn)行的行為就不需要額外的字段了。例如,在這個(gè)例子中:

class Foo {
    var myProperty: Int = 0 {
        didSet {
            print("myProperty 的值從 \(oldValue) 更改為 \(myProperty)")
        }
    }
}

每當(dāng) myProperty 被修改時(shí)都會(huì)輸出舊的值和新的值。但如果只有 getter 和 setter,就需要這樣做:

class Foo {
    var myPropertyValue: Int = 0
    var myProperty: Int {
        get { return myPropertyValue }
        set {
            print("myProperty 的值從 \(myPropertyValue) 更改為 \(myProperty)")
            myPropertyValue = newValue
        }
    }
}

所以 willSetdidSet 可以節(jié)省幾行代碼,并且精簡(jiǎn)了字段列表。

另外注意:根據(jù)蘋(píng)果的注釋,在初始化方法中設(shè)置屬性不會(huì)調(diào)用 willSet 和 didSet:willSet and didSet observers are not called when a property is first initialized. They are only called when the property’s value is set outside of an initialization context.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容