Das solltest du nicht. Es ist ein weit verbreitetes Missverständnis, dass SwiftUI am besten mit MVVM funktioniert.
MVVM hat keinen Platz in SwfitUI. Sie fragen, ob Sie ein Rechteck auf schieben können
eine Dreiecksform anpassen. Es würde nicht passen.
Beginnen wir mit einigen Fakten und arbeiten Schritt für Schritt:
ViewModel ist ein Modell in MVVM.
MVVM berücksichtigt keinen Werttyp (z. B. in Java nicht).
Ein Werttypmodell (Modell ohne Status) gilt als sicherer als Referenz
Typmodell (Modell mit Zustand) im Sinne der Unveränderlichkeit.
In MVVM müssen Sie jetzt ein Modell so einrichten, dass es bei jeder Änderung geändert wird
aktualisiert die Ansicht auf eine vorher festgelegte Weise. Dies wird als Bindung bezeichnet.
Ohne Bindung haben Sie keine schöne Trennung von Bedenken, z. Refactoring aus
Modell und zugehörige Zustände und deren Trennung von der Ansicht.
Dies sind die beiden Dinge, die die meisten iOS MVVM-Entwickler versagen:
iOS hat keinen "Bindungs" -Mechanismus im traditionellen Java-Sinne.
Einige würden die Bindung einfach ignorieren und denken, ein Objekt ViewModel aufzurufen
löst automatisch alles; Einige würden KVO-basierten Rx einführen, und
komplizieren Sie alles, wenn MVVM die Dinge einfacher machen soll.
Modell mit Staat ist einfach zu gefährlich
weil MVVM zu viel Wert auf ViewModel legt, zu wenig auf die Statusverwaltung
und allgemeine Disziplinen bei der Verwaltung der Kontrolle; Die meisten Entwickler landen am Ende
Denken, ein Modell mit Status, der zum Aktualisieren der Ansicht verwendet wird, ist wiederverwendbar und
testbar .
Aus diesem Grund führt Swift in erster Linie den Werttyp ein. ein Modell ohne
Zustand.
Nun zu Ihrer Frage: Sie fragen, ob Ihr ViewModel Zugriff auf EnvironmentObject (EO) haben kann?
Das solltest du nicht. Denn in SwiftUI hat ein Modell, das der Ansicht entspricht, automatisch
Verweis auf EO. Z.B;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
Ich hoffe, die Leute können verstehen, wie kompakt das SDK ist.
In SwiftUI erfolgt MVVM automatisch . Es ist kein separates ViewModel-Objekt erforderlich
Das wird manuell an die Ansicht gebunden, für die eine EO-Referenz erforderlich ist.
Der obige Code ist MVVM. Z.B; ein Modell mit Bindung zur Ansicht.
Aber weil Modell ein Werttyp ist, anstatt Modell und Status als umzugestalten
Wenn Sie das Modell anzeigen, überarbeiten Sie die Kontrolle (z. B. in der Protokollerweiterung).
Dies ist das offizielle SDK, das das Designmuster an die Sprachfunktion anpasst und nicht nur
Durchsetzung. Substanz über Form.
Schauen Sie sich Ihre Lösung an, Sie müssen Singleton verwenden, das im Grunde global ist. Du
sollte wissen, wie gefährlich es ist, global überall ohne Schutz von zuzugreifen
Unveränderlichkeit, die Sie nicht haben, weil Sie Referenztyp-Modell verwenden müssen!
TL; DR
In SwiftUI wird MVVM nicht auf Java-Weise ausgeführt. Und der schnelle Weg, dies zu tun, ist nicht nötig
dafür ist es bereits eingebaut.
Hoffe, dass mehr Entwickler dies sehen, da dies eine beliebte Frage zu sein schien.