首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Swift 屬性觀察器詳解:willSet 與 didSet 完全指南

     編輯:關於C++

屬性觀察器功能

屬性觀察器監聽並響應屬性值的變化。每次設置屬性值時都會調用,即使新值與舊值相同也不例外。適用於存儲屬性與繼承的計算屬性(需用 override 重寫)。

注意:對於自定義的計算屬性,直接在 setter 中處理邏輯即可,無需額外添加觀察器。

兩種觀察器方法

方法調用時機參數默認參數名
willSet設置新值之前新值newValue
didSet新值設置之後立即調用舊值oldValue

關鍵注意事項

  1. 初始化過程不觸發:在 init 中賦值不會調用 willSet/didSet,只有初始化完成後、在其他地方設置值時才觸發。
  2. didSet 中再次賦值會替換原值:若在 didSet 內對屬性重新賦值,該新值將覆蓋剛設置的值(不會再次觸發觀察器,避免無限循環)。

代碼範例

class Person: NSObject {
    var age: Int?               // 無觀察器
    var name: String? {         // 帶觀察器
        willSet {
            print("willSet: name 將從 \(name ?? \"nil\") 變為 \(newValue ?? \"nil\")")
        }
        didSet {
            print("didSet: name 已從 \(oldValue ?? \"nil\") 變為 \(name ?? \"nil\")")
        }
    }
}

let p = Person()
p.name = "Alice"  // 觸發 willSet -> didSet
p.name = "Bob"    // 再次觸發
p.name = "Bob"    // 值相同仍觸發

輸出結果

willSet: name 將從 nil 變為 Alice
didSet: name 已從 nil 變為 Alice
willSet: name 將從 Alice 變為 Bob
didSet: name 已從 Alice 變為 Bob
willSet: name 將從 Bob 變為 Bob
didSet: name 已從 Bob 變為 Bob

進階應用場景

  • UI 同步更新:屬性變化時自動刷新界面(MVVM 中常見)。
  • 數據驗證/清理:willSet 中攔截非法值,didSet 中格式化存儲。
  • 副作用觸發:如日誌記錄、網絡請求、緩存失效等。
  • KVO 替代方案:純 Swift 類中比 KVO 更類型安全、性能更好。

總結

Swift 屬性觀察器提供了聲明式的屬性變化響應機制,willSet/didSet 配合 newValue/oldValue 參數,讓副作用邏輯與業務邏輯清晰分離。記住「初始化不觸發」與「didSet 可覆蓋值」兩大特性,避免常見坑點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved