(@38Punkd)です。ゴールドスポンサーとして協賛します。私はそのスポンサーセッション枠として登壇します。この記事では、当日発表する内容を少し先出ししてご紹介できればと思います。いうプロダクトを、Web・iOS・Androidの3プラットフォーム上で提供しています。iOSアプリではVIPERアーキテクチャを導入しています。具体的な導入方法については、弊社で以前に試行錯誤した様子が以下の記事で解説されていますので、気になる方は読んでみてください。導入を本格的に検討しました。実際にSwiftUIを導入するに至ったのですが、これまでVIPERで構築してきたアプリに対して、SwfiftUIを導入する上で何を具体的に検討したかをご紹介します。SwiftUIとは2019年にApple社が提供開始した宣言的UIフレームワークのことです。XcodeのGUIでSwiftUIを選択してファイルを新規作成すると、以下のようなViewが初期生成されます。}}SwiftUIには2つの大きな特徴があります。データバインドの仕組みを持つUIKitと互換性があるそれぞれについて簡単に補足します。データバインドの仕組みを持つSwiftUIは先のコードで示したように、画面に表示するViewを構築する部分をViewプロトコルに準拠した構造体で表現します。Viewの画面更新をするには、ObservableObjectプロトコルに準拠した、状態管理用クラスを用意します。Viewの該当のViewが自動更新されるため、SwiftUIはそれ自体がMVVMの特性を持ちます。UIViewRepresentableが用意されています。13以上ならどこからでも呼び出せるため、SwiftUIはUIKitと互換性が非常に高いと言えます。実際にVIPERにSwiftUIを導入する上で検討したことこれまでUIKitを用いてUIViewController上でViewを構築してきたので、SwiftUIを導入することでアンコントローラブルな点が出てこないか、また、データバインドの仕組みを持つSwiftUIがVIPERに馴染めるか等の相性を考慮する必要があります。この相性について大きく分けると、以下2点を考慮する必要があります。UIViewControllerがSwiftUIのライフサイクルをハンドリングできるかUIViewControllerがSwiftUIのイベントをハンドリングできるか1点目について、詳しく説明します。UIViewControllerがSwiftUIのライフサイクルをハンドリングできるか“SwiftUIのライフサイクル”は、さらに3つの具象に分けて考えられます。ViewをUIKitで使うためのラッパーUIHostingControllerのライフサイクル1つ目について、深掘ります。SwiftUIのView自身のライフサイクルをハンドリングできるかViewのライフサイクルとは、Viewがインスタンス生成された後に画面として使われ、その後インスタンス破棄されるまでの一連の流れのことを指します。UIViewControllerのライフサイクルに対して、UIKitでは多くのメソッドが提供されています。出典:https://developer.apple.com/documentation/uikit/uiviewcontroller対してSwiftUIでは、viewDidAppearとViewDidDisappearに相当する、onAppearとonDisappearメソッドの2つだけが提供されています。このonAppearとonDisappearメソッドは、いくつかのケースにおいては呼ばれないことがあります。ある画面のライフサイクルメソッドを呼ぶには、その画面への遷移ロジックが必要です。View間の画面遷移ロジックを担います。16からは、NavigationStackも使えるようになります)。このNavigationViewは、挙動が比較的不安定であると言われています。これらを踏まえて、ライフサイクルメソッドを呼ぶための画面遷移ロジックは、現時点ではSwiftUIの機構に任せるのではなく、UIViewControllerに任せる判断をしました。Viewはインスタンス生成のタイミングについてはどうでしょうか。Viewが準拠するViewプロトコルには、idメソッドがデフォルト実装されています。Viewがインスタンス生成されるタイミングは、自身の保持するIDが生成・更新された時だと分かります。以上から、SwiftUIのView自身のライフサイクルをハンドリングをするには、3点を考慮すれば良いと言えます。Viewの責務は、見た目の部分のみを担わせた方が良さそうと言えます。続いて、先ほど列挙した3つの具象のうち、2つ目についてです。Viewの状態管理をするには、ObservableObjectプロトコルに加えて、@StateObjectや@ObservedObjectを用います。どちらも、ObservableObjectプロトコルに準拠しているクラス内の値変化を、監視できるようにするためのプロパティラッパーです。両者の違いは、@StateObjectは、保持するViewに対して、インスタンスが1つだけ生成されるのに対して、@ObservedObjectは、保持するViewのライフサイクルに依存し、親Viewの再描画でインスタンスは再生成されるという点です。14からしか使えません。@ObservedObjectを使うことが必須になります。結論としては、@ObservedObjectは親Viewのライフサイクルに依存するので、画面単位のライフサイクルと一致させると、ハンドリングしやすいという考えに至りました。すれば、ObservableObjectプロトコルのライフサイクルをハンドリングしやすいと言えます。最後に、3つ目についてです。ViewをUIKitで使うためのラッパーUIHostingControllerのライフサイクルをハンドリングできるかこれについては、UIHostingControllerはUIViewControllerを継承しているので、ライフサイクルを親ViewControllerに委譲(didMoveメソッドで可能)できます。Viewのライフサイクルをコントロールできます。ここまで、UIViewControllerがSwiftUIのライフサイクルをハンドリングできるかについて、説明してきました。SwiftUIのイベントハンドリングについてはどうでしょうか。View内で発生するイベント、例えばボタンタップは、タップ時の処理を記述できます(当たり前と言えば当たり前ですが)。Viewのイベントをハンドリングできます。具体的には、以下のように完了ハンドラや、デリゲート等でハンドリングできます。}まとめSwiftUIの性質を分けて、VIPERにSwiftUIを導入する上で検討した事をご紹介しました。ViewをUIKitで使うためのラッパーUIHostingControllerのライフサイクルUIViewControllerがSwiftUIのイベントをハンドリングできるか以上を踏まえて、最終的にSwiftUIを導入する上での要件を定めました。理工学部西早稲田キャンパスTrack:C当日はスポンサーセッションだけでなく、ブースも出展しますので、気軽に遊びに来てください!当日お会いできる事を楽しみにしています!!tech.stmn.co.jp採用情報スタメンでは、iOSエンジニアに限らず全技術領域で、プロダクトを成長させていくエキスパートを募集しています。明けましておめでとうございます。株式会社スタメンでは、エンジニア採用を強化しています。ご興味のある方はぜひエンジニア採用情報をご覧ください。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。