Combineでは、どのようにCombineを使用してMVVMを実現するかを説明したいと思います。requirements?今回、実現したいことは以下です。TextFieldを追加し、テキストを入力できるようにする入力されたテキストをバリデーションするロジック部分をViewModelとして分け、viewとmodelを分離するviewとViewModelをつなぎ合わせるTextFieldのコンテンツをtwo-wayバインディングするContentViewにTextFieldを追加するコードは以下のようになります。}}VStackで縦方向のStackViewを作成し、その中にTextFieldを配置しています。変数に@Stateを付けることによって、Viewと変数をtwo-wayバインディングで紐付けることができます。$変数のように$プレフィックスを付けることで、Bindingオブジェクトを取得することができます。ここからViewModelに分割していきます。次にViewModelを作成します。""}ViewModelを作成し、ObservableObjectを適応します。}を宣言することを要求しています。Never>()今回は単純な変更通知を送るためにPassthroughSubjectを用いて宣言しました。usernameという変数を定義し、willSetでobjectWillChange.send(())を呼びます。willSetが呼ばれると、SwiftUI側へViewの更新通知が行うようにしています。@Publishedを使用するとobjectWillChangeのパブリッシャーはwillSetで自動的に呼ばれるようになりました。}}$usernameでusernameの変更を受け取ることができます。Never>を定義しています。今回はAPIの実装は行いませんでしたが、Futureを用いることで非同期処理も行うことができます。今回はusernameが有効であれば、usernameを返し、無効であればnilを返すように実装しました。.red)}バリデーションの結果を見やすいように、簡単なラベルを追加します。StatusTextはテキストとカラーも持つオブジェクトにしました。ViewModelにonApprear()を追加ContentViewが表示された際の処理を記述していきます。}}usernameが有効の場合、usernameを有効な値で書き換えています。&self.cancellables)usernameが有効の場合はOK、無効な場合はNGと表示するStatusTextを作成し、Viewを更新するようにしています。&self.cancellables)sink()関数でAnyCancellableが返ってくるので、store関数で開放されないように保持することができます。これをしないと更新通知を受け取ることができません。ViewModelにonDisapprear()を追加ContentViewが非表示になった際の処理を記述していきます。}}onApprearでcancellablesに保持していたAnyCancellableの配列をViewの非表示時に開放してあげます。}}このように記述することでContentViewとContentViewModelをバインディングしました。