Как я могу быстро реализовать наблюдатель свойств в структуре оболочки свойств? - PullRequest
2 голосов
/ 12 июля 2020

Поскольку наблюдатели за свойствами наблюдают и реагируют на изменения, и именно этим они занимаются, почему они не отображаются в оболочке свойств?

import Foundation

@propertyWrapper
struct Property {
    
    private var number: Int = 0
    private var maximum: Int = 0
    
    var wrappedValue: Int {
        
        get { return number }
        set { number = min(newValue, maximum) }
    }

    init() {
        maximum = 12
        number = 0
    }
    
    init(wrappedValue: Int) {
        maximum = 12
        number = min(wrappedValue, maximum)
    }
    
    init(wrappedValue: Int, maximum: Int) {
        self.maximum = maximum
        number = min(wrappedValue, maximum)
    }
    
    willSet() {}
    didSet() {}
}


struct SmallRectangle {
    
    @Property(wrappedValue: 12, maximum: 25) var _height: Int
    @Property(wrappedValue: 12, maximum: 25) var _width: Int
}

var smallRectangle = SmallRectangle()
smallRectangle._height = 18

print(smallRectangle._height)
* 1003 ) вызывающие наблюдатели свойств. Хоть я и не установил, игровая площадка выдает ошибку. Может ли кто-нибудь сказать мне, делаю ли я это или как мне это делать?

1 Ответ

1 голос
/ 12 июля 2020

Обертки свойств на самом деле являются просто классами / структурами. На самом деле они не являются собственностью. Они оборачивают свойство с именем wrappedValue. Итак, чтобы «наблюдать» за оболочкой свойств, вы должны наблюдать, что wrappedValue.

wrappedValue в вашем коде является вычисляемым свойством. Вычисляемые свойства не нуждаются в наблюдателях свойств. См. этот мой ответ , почему. Если вы хотите «наблюдать» wrappedValue, просто напишите нужный код в set:

var wrappedValue: Int {
    
    get { return number }
    set { 
        // write willSet here...
        number = min(newValue, maximum) 
        // write didSet here...
    }
}

Вы можете наблюдать за ним, если wrappedValue было сохраненным свойством:

@propertyWrapper
struct Property {

    ...

    var wrappedValue: Int {
        didSet { ... }
        willSet { ... }
    }
}
...