В чем основное различие между наблюдателями свойств и оболочками свойств? - PullRequest
0 голосов
/ 17 июня 2020

В чем основное различие между наблюдателями свойств и оболочками свойств? Они кажутся очень похожими в том, что управляют хранением свойств. Единственное, о чем я могу думать, это то, что вы можете повторно использовать оболочки свойств, поскольку существует уровень разделения между кодом, который управляет хранением свойства, и кодом, определяющим свойство.

Property Wrapper

@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
            }
        }
    }
}

Два приведенных выше случая выполнены sh в значительной степени одно и то же, а именно: установить свойства как равно или меньше 12.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Еще одно большое различие между наблюдателями свойств и оболочками свойств заключается в том, что наблюдатели свойств могут получить доступ к self, в то время как оболочки свойств еще не могут (на момент написания) получить доступ к self, используя стабильный, документированный интерфейс.

Это ограничение можно обойти, вручную передав self оболочке свойств в init. Этот обходной путь описан в предложении обертки свойств .

Вы можете получить доступ к self в оболочке свойств, используя недокументированный, нестабильный интерфейс, о котором вы можете узнать, набрав «оболочка свойств _enclosingInstance» в вашу любимую поисковую систему.

1 голос
/ 17 июня 2020

Вы говорите:

Единственное, что я могу придумать, это то, что вы можете повторно использовать оболочки свойств, поскольку существует уровень разделения между кодом, который управляет хранением свойства, и кодом, определяющим недвижимость.

Ваш пример (и часть вашего текста), похоже, взят из Swift Programming Language: Property Wrapper manual:

Property wrapper добавляет уровень разделения между кодом, который управляет хранением свойства, и кодом, определяющим свойство. Например, если у вас есть свойства, которые обеспечивают проверки безопасности потоков или хранят свои базовые данные в базе данных, вы должны написать этот код для каждого свойства. Когда вы используете оболочку свойства, вы пишете код управления один раз, когда определяете оболочку, а затем повторно используете этот код управления, применяя его к нескольким свойствам.

Итак, да, достоинство свойства Обертка - это повторное использование, достигаемое путем разделения «кода, который управляет хранением свойства, и кода, определяющего свойство». Это результирующее повторное использование - это целая мость оболочек свойств.

Очевидно, вы можете написать свои собственные сеттеры и геттеры (что лучше, ИМХО, чем шаблон написания наблюдателя, который сам себя мутирует), но вы теряете повторное использование и абстракцию, которые предлагают оболочки свойств. - установить свойства равными или меньше 12.

Конечно, но если вы хотите сделать это для десяти различных свойств, оболочка избавит вас от необходимости повторять этот код десять раз. Он также абстрагирует детали этого «равного или меньше 12» logi c от того места, где вы объявляете свойство.

...