すべきではない。SwiftUIがMVVMで最適に動作するのはよくある誤解です。
MVVMはSwfitUIにありません。あなたは長方形を突き出すことができるかどうかを尋ねています
三角形にフィットします。合いません。
いくつかの事実から始めて、段階的に作業してみましょう。
ViewModelはMVVMのモデルです。
MVVMは、値の型(Javaにはそのようなものがないなど)を考慮に入れません。
値型モデル(状態のないモデル)は参照よりも安全であると見なされます
タイプモデル(状態を持つモデル)は不変性の意味で。
MVVMでは、モデルが変更されるたびに、
あらかじめ決められた方法でビューを更新します。これはバインディングと呼ばれます。
拘束力がなければ、懸念を適切に分離することはできません。リファクタリング
モデルと関連する状態、およびそれらをビューから分離した状態に保ちます。
これらは、ほとんどのiOS MVVM開発者が失敗する2つの問題です。
iOSには、従来のJavaの意味での「バインド」メカニズムはありません。
バインドを無視して、オブジェクトViewModelを呼び出すと考える人もいます。
すべてを自動的に解決します。一部はKVOベースのRxを導入し、
MVVMが物事をより単純にすることになっている場合、すべてを複雑にします。
状態のモデルは危険すぎる
MVVMはViewModelに過度の重点を置き、状態管理にはあまりにも重点を置いているため
および統制の管理における一般的な分野。ほとんどの開発者は結局
ビューの更新に使用される状態のあるモデルは再利用可能であり、
テスト可能。
これが、Swiftが最初に値型を導入する理由です。なしのモデル
状態。
さてあなたの質問へ:あなたのViewModelがEnvironmentObject(EO)にアクセスできるかどうか尋ねますか?
すべきではない。SwiftUIでは、Viewに準拠するモデルには自動的に
EOへの参照。例えば;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
コンパクトなSDKがどのように設計されているかを人々に理解してもらいたいと思います。
SwiftUIでは、MVVMは自動です。個別のViewModelオブジェクトは必要ありません。
これは、EO参照を渡す必要があるビューに手動でバインドします。
上記のコードは MVVMです。例えば; ビューにバインドするモデル。
しかし、モデルは値型なので、モデルをリファクタリングする代わりに、
モデルを表示すると、(プロトコル拡張などで)コントロールをリファクタリングします。
これは、デザインパターンを言語機能に適合させるだけでなく、公式のSDKです。
それを実施します。フォームよりも実質。
あなたのソリューションを見てください、あなたは基本的にグローバルであるシングルトンを使わなければなりません。君は
の保護なしにどこにでもグローバルにアクセスすることはどれほど危険か
不変性。参照型モデルを使用する必要があるため、これはありません。
TL; DR
SwiftUIではJavaの方法でMVVMを実行しません。そしてそれを行うSwift-yの方法は必要ありません
それを行うために、それはすでに組み込まれています。
これはよくある質問のように思われたので、もっと多くの開発者にこれを見てもらいたい。