Я пытаюсь создать пользовательскую оболочку свойства, поддерживаемую SwiftUI, то есть изменение соответствующих значений свойств приведет к обновлению представления SwiftUI. Вот упрощенная версия того, что у меня есть:
@propertyWrapper
public struct Foo: DynamicProperty {
@ObservedObject var observed: SomeObservedObject
public var wrappedValue: [SomeValue] {
return observed.value
}
}
Я вижу, что даже если my ObservedObject
содержится внутри моей оболочки пользовательских свойств, SwiftUI по-прежнему фиксирует изменения до SomeObservedObject
тех пор, пока:
- Моя оболочка свойства является структурой
- Моя оболочка соответствует
DynamicProperty
К сожалению, документы довольно скудны, и мне трудно сказать, удастся ли это только удаче с текущей реализацией SwiftUI.
Документы о DynamicProperty
(в Xcode, а не в сети), по-видимому, указывают на то, что такое свойство является свойством, которое изменяется извне, вызывая перерисовку представления, но нет никакой гарантии относительно того, что происходит, когда вы настраиваете свои собственные типы для этого протокола.
Могу ли я ожидать, что это продолжит работать в будущих выпусках SwiftUI?
источник
Ответы:
Хорошо ... вот альтернативный подход, чтобы получить похожую вещь ... но так как структура только
DynamicProperty
обернута@State
(чтобы заставить представление обновить).Это простая оболочка, но она дает возможность инкапсулировать любые пользовательские вычисления с последующим обновлением представления ... и, как сказано, используя типы только для значений.
Вот демо (протестировано с Xcode 11.2 / iOS 13.2):
Вот код:
источник