Non dovresti. È un'idea sbagliata comune che SwiftUI funzioni meglio con MVVM.
MVVM non ha posto in SwfitUI. Stai chiedendo se puoi spingere un rettangolo su
misura una forma triangolare. Non si adatterebbe.
Cominciamo con alcuni fatti e lavoriamo passo dopo passo:
ViewModel è un modello in MVVM.
MVVM non prende in considerazione il tipo di valore (ad esempio, nessuna cosa simile in Java).
Un modello del tipo di valore (modello senza stato) è considerato più sicuro del riferimento
tipo di modello (modello con stato) nel senso di immutabilità.
Ora, MVVM richiede di impostare un modello in modo tale che ogni volta che cambi, esso
gli aggiornamenti vengono visualizzati in un modo predeterminato. Questo è noto come vincolante.
Senza vincolo, non avrai una buona separazione delle preoccupazioni, ad es. refactoring fuori
modello e stati associati e mantenendoli separati dalla vista.
Queste sono le due cose che la maggior parte degli sviluppatori iOS MVVM non riesce:
iOS non ha alcun meccanismo "vincolante" nel senso tradizionale di Java.
Alcuni ignorerebbero semplicemente l'associazione e penserebbero di chiamare un oggetto ViewModel
risolve automagicamente tutto; alcuni introdurrebbero Rx basato su KVO e
complicare tutto quando MVVM dovrebbe semplificare le cose.
il modello con stato è troppo pericoloso
perché MVVM pone troppa enfasi su ViewModel, troppo poco sulla gestione dello stato
e discipline generali nella gestione del controllo; la maggior parte degli sviluppatori finisce
pensare che un modello con stato utilizzato per aggiornare la vista sia riutilizzabile e
testabile .
questo è il motivo per cui Swift introduce innanzitutto il tipo di valore; un modello senza
stato.
Ora alla tua domanda: chiedi se ViewModel può avere accesso a EnvironmentObject (EO)?
Non dovresti. Perché in SwiftUI è automaticamente presente un modello conforme a Visualizza
riferimento a EO. Per esempio;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
Spero che le persone possano apprezzare la progettazione dell'SDK compatto.
In SwiftUI, MVVM è automatico . Non è necessario un oggetto ViewModel separato
che si lega manualmente alla visualizzazione che richiede un riferimento EO passato ad esso.
Il codice sopra è MVVM. Per esempio; un modello con rilegatura da visualizzare.
Ma poiché il modello è un tipo di valore, quindi invece di eseguire il refactoring di modello e dichiarare come
guarda il modello, rifatti il controllo (ad esempio nell'estensione del protocollo).
Questo è l'SDK ufficiale che adatta il modello di progettazione alle funzionalità del linguaggio, piuttosto che solo
applicandolo. Sostanza più che forma.
Guarda la tua soluzione, devi usare singleton che è sostanzialmente globale. voi
dovrebbe sapere quanto sia pericoloso accedere a livello globale ovunque senza protezione
immutabilità, che non hai perché devi usare un modello di riferimento!
TL; DR
Non fai MVVM in modo java in SwiftUI. E il modo Swift-y per farlo non è necessario
per farlo, è già integrato.
Spero che più sviluppatori vedano questo dato che questa sembra una domanda popolare.