Ich versuche, einen benutzerdefinierten Eigenschaften-Wrapper zu erstellen, der von SwiftUI unterstützt wird. Dies bedeutet, dass Änderungen an den entsprechenden Eigenschaftenwerten eine Aktualisierung der SwiftUI-Ansicht bewirken würden. Hier ist eine vereinfachte Version von dem, was ich habe:
@propertyWrapper
public struct Foo: DynamicProperty {
@ObservedObject var observed: SomeObservedObject
public var wrappedValue: [SomeValue] {
return observed.value
}
}
Ich sehe, dass ObservedObject
SwiftUI die Änderungen auch dann abfängt , wenn meine in meinem benutzerdefinierten Eigenschafts-Wrapper enthalten ist, SomeObservedObject
solange:
- Mein Property Wrapper ist eine Struktur
- Mein Property Wrapper entspricht
DynamicProperty
Leider sind die Dokumente spärlich und es fällt mir schwer zu sagen, ob dies nur mit der aktuellen SwiftUI-Implementierung aus Glück funktioniert.
Die Dokumente von DynamicProperty
(innerhalb von Xcode, nicht online) scheinen darauf hinzuweisen, dass eine solche Eigenschaft eine Eigenschaft ist, die von außen geändert wird, wodurch die Ansicht neu gezeichnet wird. Es gibt jedoch keine Garantie dafür, was passiert, wenn Sie Ihre eigenen Typen an dieses Protokoll anpassen.
Kann ich davon ausgehen, dass dies auch in zukünftigen SwiftUI-Versionen funktioniert?
quelle
Antworten:
Ok ... hier ist ein alternativer Ansatz, um ähnliche Dinge zu erhalten ... aber als Struktur nur
DynamicProperty
umwickelt@State
(um die Aktualisierung der Ansicht zu erzwingen).Es ist ein einfacher Wrapper, bietet jedoch die Möglichkeit, benutzerdefinierte Berechnungen mit der folgenden Ansichtsaktualisierung zu kapseln ... und wie gesagt nur mit Werttypen.
Hier ist eine Demo (getestet mit Xcode 11.2 / iOS 13.2):
Hier ist Code:
quelle