В оболочке свойств в Swift, можете ли вы обратиться к экземпляру класса или к удару, которому принадлежит обернутое свойство? Использование self
явно не работает, как и super
.
Я пытался передать self
в оболочку свойства init()
, но это тоже не работает, потому что self
в Configuration
еще не определено при оценке @propertywrapper
.
Мой вариант использования относится к классу для управления большим количеством настроек или конфигураций. Если какое-либо свойство изменяется, я просто хочу уведомить заинтересованные стороны, что что-то изменилось. Им действительно не нужно знать, какое значение просто, поэтому использовать что-то вроде KVO
или Publisher
для каждого свойства на самом деле не нужно.
Оболочка свойства выглядит идеально, но я не могу понять, как передать какую-то ссылку на экземпляр-владелец, которому обертка может вызывать обратно.
Рекомендации:
SE-0258
enum PropertyIdentifier {
case backgroundColor
case textColor
}
@propertyWrapper
struct Recorded<T> {
let identifier:PropertyIdentifier
var _value: T
init(_ identifier:PropertyIdentifier, defaultValue: T) {
self.identifier = identifier
self._value = defaultValue
}
var value: T {
get { _value }
set {
_value = newValue
// How to callback to Configuration.propertyWasSet()?
//
// [self/super/...].propertyWasSet(identifier)
}
}
}
struct Configuration {
@Recorded(.backgroundColor, defaultValue:NSColor.white)
var backgroundColor:NSColor
@Recorded(.textColor, defaultValue:NSColor.black)
var textColor:NSColor
func propertyWasSet(_ identifier:PropertyIdentifier) {
// Do something...
}
}