iOS開發(fā) - 「Swift 學(xué)習(xí)」Swift屬性包裝器@propertyWrapper(一)

定義:

在 Swift 5.1 中引入了@propertyWrapper這個特性,屬性包裝器是在 管理屬性存儲方式的代碼和定義屬性的代碼之間添加了一層分離。管理屬性的setget方式由屬性包裝器接管,定義屬性的代碼還在原來的類中。**

參考來源 →

作用:

如果你有屬性提供了線程安全檢查或?qū)?shù)據(jù)存到數(shù)據(jù)庫功能,那么你將需要為每個屬性編寫類似代碼。有了屬性包裝器,我們就可以避免類似重復(fù)代碼。

使用場景:

?驗(yàn)證屬性值的合法性,例如范圍、格式、唯一性等;
?處理屬性值的變化,例如映射、轉(zhuǎn)換、格式化等;
?控制屬性的存儲和訪問方式,例如延遲加載、懶加載、緩存等;
?實(shí)現(xiàn)屬性的依賴關(guān)系,例如自動更新、自動綁定等。

實(shí)現(xiàn):

通過 @propertyWrapper來標(biāo)識struct, enum, class實(shí)現(xiàn)屬性包裝。

要點(diǎn):

?必須使用屬性@propertyWrapper進(jìn)行定義;
?必須為包裝器添加 wrappedValue 屬性;
?@propertyWrapper 只能用于屬性,不能用于計算屬性或者函數(shù);
?@propertyWrapper 可以應(yīng)用于單個屬性或者整個結(jié)構(gòu)體/類中的所有屬性;
?使用 @propertyWrapper 時,需要為包裝器提供一個默認(rèn)值;
?如果屬性包裝器需要進(jìn)行一些額外的初始化,需要使用 init(wrappedValue:) 方法。

結(jié)構(gòu)示例:

@propertyWrapper
 struct NumberWrapper {    
     private var value: Int = 0
     var wrappedValue: Int {
         get {
             return value
         }
         set {
             //  value <= 10
             value = min(newValue, 10)
         }
     }
 }
 

struct Number {
    // 告訴編譯器使用Wrapper包裝器包裝該屬性
    @NumberWrapper var number: Int
}

調(diào)用分析:
使用@NumberWrapper時編譯器會轉(zhuǎn)為下面的執(zhí)行過程

struct Number {
    private var _number = NumberWrapper()
 
    var number: Int {
        get { return _number.wrappedValue }
        set { _number.wrappedValue = newValue }
    }
}

?調(diào)用 Number 中number 的 set 函數(shù)
?調(diào)用 屬性包裝器的 _number.wrappedValue 的 set函數(shù)
?調(diào)用 number = min(newValue, 10) 來保證新設(shè)置的值小于等于 10

使用限制:

  • 協(xié)議的屬性不支持使用屬性包裝器
  • extension中不可以使用(擴(kuò)展內(nèi)聲明的非靜態(tài)屬性不能有包裝器)
  • enum中不可以使用(屬性包裝器只能應(yīng)用于屬性)
  • class里的 wrapper property 屬性不能被重寫
  • wrapper 不能定義 getter 或 setter 方法 ( 屬性包裝器不能應(yīng)用于計算屬性)
  • wrapper 屬性不能被 lazy、 @NSCopying、 @NSManaged、 weak、 或者 unowned 修飾

下一篇:iOS開發(fā) - 「Swift 學(xué)習(xí)」Swift屬性包裝器@propertyWrapper 投影值 projectedValue(二)


\color{gray}{歡迎大佬兒來指正糾錯,共同學(xué)習(xí)????!}

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

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

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