Nie powinieneś To powszechne błędne przekonanie, że SwiftUI działa najlepiej z MVVM.
MVVM nie ma miejsca w SwfitUI. Pytasz, czy możesz przesunąć prostokąt
pasują do kształtu trójkąta. Nie pasowałoby.
Zacznijmy od kilku faktów i pracuj krok po kroku:
ViewModel to model w MVVM.
MVVM nie bierze pod uwagę typu wartości (np. Nie ma czegoś takiego w java).
Model typu wartości (model bez stanu) jest uważany za bezpieczniejszy niż referencyjny
model typu (model ze stanem) w sensie niezmienności.
Teraz MVVM wymaga skonfigurowania modelu w taki sposób, aby za każdym razem, gdy się zmieniał
aktualizuje widok w określony sposób. Jest to znane jako wiązanie.
Bez wiązania nie będziesz miał przyjemnego rozdziału problemów, np. refaktoryzacja
model i skojarzone stany oraz oddzielając je od widoku.
Są to dwie rzeczy, których zawodzi większość programistów iOS MVVM:
iOS nie ma mechanizmu „wiązania” w tradycyjnym sensie Java.
Niektórzy po prostu zignorują powiązanie i pomyślą o wywołaniu obiektu ViewModel
automagicznie rozwiązuje wszystko; niektórzy wprowadziliby Rx oparte na KVO i
komplikuj wszystko, gdy MVVM ma uprościć sprawę.
model ze stanem jest po prostu zbyt niebezpieczny
ponieważ MVVM kładzie zbyt duży nacisk na ViewModel, zbyt mało na zarządzanie stanem
oraz ogólne dyscypliny w zarządzaniu Kontrolą; większość programistów kończy
myślenie, że model ze stanem używanym do aktualizacji widoku jest wielokrotnego użytku i
testowalny .
dlatego Swift przede wszystkim wprowadza rodzaj wartości; model bez
stan.
Teraz pytanie: pytasz, czy Twój ViewModel może mieć dostęp do EnvironmentObject (EO)?
Nie powinieneś Ponieważ w SwiftUI automatycznie ma model zgodny z View
odniesienie do EO. Na przykład;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
Mam nadzieję, że ludzie docenią projekt kompaktowego zestawu SDK.
W SwiftUI MVVM działa automatycznie . Nie ma potrzeby oddzielnego obiektu ViewModel
który ręcznie łączy się z widokiem, który wymaga przekazania do niego referencji EO.
Powyższy kod to MVVM. Na przykład; model z wiązaniem do wyświetlenia.
Ale ponieważ model jest typem wartości, więc zamiast refaktoryzować model i podać stan jako
zobacz model, refaktoryzujesz kontrolę (na przykład w rozszerzeniu protokołu).
Jest to oficjalny zestaw SDK, dostosowujący wzór projektowy do funkcji języka, a nie tylko
egzekwowanie tego. Substancja nad formą.
Spójrz na swoje rozwiązanie, musisz użyć singletona, który jest zasadniczo globalny. ty
powinien wiedzieć, jak niebezpieczny jest dostęp globalny w dowolnym miejscu bez ochrony
niezmienność, której nie masz, ponieważ musisz użyć modelu typu referencyjnego!
TL; DR
Nie wykonujesz MVVM w języku Java w SwiftUI. A szybki sposób na zrobienie tego nie jest potrzebny
aby to zrobić, jest już wbudowany.
Mam nadzieję, że więcej programistów to zobaczy, ponieważ wydawało się to popularnym pytaniem.