簡體   English   中英

屬性觀察者和屬性包裝器之間的主要區別是什么?

[英]What's the main difference between property observers and property wrappers?

屬性觀察者和屬性包裝器之間的主要區別是什么? 它們似乎非常相似,因為它們管理屬性的存儲方式。 我唯一能想到的是您可以重用屬性包裝器,因為在管理屬性存儲方式的代碼和定義屬性的代碼之間存在一層分離。

屬性包裝器

@propertyWrapper
struct TwelveOrLess {
    private var number: Int
    init() { self.number = 0 }
    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, 12) }
    }
}

struct Rectangle {
    @TwelveOrLess var height: Int
    @TwelveOrLess var width: Int
}

物業觀察員

struct Rectangle {
    var height: Int {
        didSet {
            if oldValue > 12 {
                height = 12
            } else {
                height = oldValue
            }
        }
    }

    var width: Int {
        didSet {
            if oldValue > 12 {
                width = 12
            } else {
                width = oldValue
            }
        }
    }
}

上面兩種情況幾乎完成了相同的事情,就是將屬性設置為等於或小於 12。

你說:

我唯一能想到的是您可以重用屬性包裝器,因為在管理屬性存儲方式的代碼和定義屬性的代碼之間存在一層分離。

您的示例(以及您的一些文本)似乎來自Swift Programming Language: Property Wrapper手冊:

屬性包裝器在管理屬性存儲方式的代碼和定義屬性的代碼之間添加了一層分隔。 例如,如果您有提供線程安全檢查的屬性或將其基礎數據存儲在數據庫中,則必須在每個屬性上編寫該代碼。 使用屬性包裝器時,您在定義包裝器時編寫一次管理代碼,然后通過將其應用於多個屬性來重用該管理代碼。

所以,是的,屬性包裝器的優點是通過分離“管理如何存儲屬性的代碼和定義屬性的代碼”來實現重用。 這種重用是屬性包裝器的全部內容。

很明顯,您也可以編寫自己的 setter 和 getter(恕我直言,這比編寫自身變異的觀察者的模式更好),但是您失去了屬性包裝器提供的重用和抽象。

你go就說:

上面兩種情況幾乎完成了相同的事情,就是將屬性設置為等於或小於 12。

當然可以,但是如果您想為十個不同的屬性執行此操作,包裝器可以避免您需要重復此代碼十次。 它還將這個“等於或小於 12”邏輯的細節從你聲明屬性的地方抽象出來。

屬性觀察器和屬性包裝器之間的另一個重大區別是屬性觀察器可以訪問self ,而屬性包裝器還不能(在撰寫本文時)使用穩定的、記錄在案的接口訪問self

您可以通過手動將self傳遞給init中的屬性包裝器來解決此限制。 屬性包裝器提案中描述了此解決方法。

您可以使用未記錄的、不穩定的接口在屬性包裝器中訪問self ,您可以通過在您最喜歡的搜索引擎中輸入“property wrapper _enclosureInstance”來了解該接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM