UIKitからSwiftUIへの書き換えを行なっている方をまとめています!:0
参考にしたい部分を書き出してます!
導入事例
Navitime
一つずつ認識のすり合わせをして、みんなが自信を持って書けたら嬉しい。
話し合い大事!
- アプリのベース部分、共通機構のレビュー
- モブプロでの開発
- 複数パターンの開発
- 再描画を抑制する
→ bodyの中身を意識。別のStructで定義するなどの工夫。
→ ObservableObjectの参照のみで、バインディングしない場合、@ObservableObjectを付けずに、普通のプロパティとして定義する(再評価の対象から外す) - UIKitとSwiftUIの混在は極力避ける
→ 混在させた場合で、データの共有が必要な場合、ObservableObjectを使用して共有を行うと良い
→ @StateObjectでObservableObjectクラスのインスタンス化をして、親から子に渡す際は@ObservedObjectを使用して共有
ZOZOTOWN
- SwiftUIを小さく導入する
→ UIViewとして書くであろう部分をSwiftUIのViewで実装する(UIViewの中でもまた小さく区切る必要はある) - SwiftUIで実装する際は、UIKitの実装へと戻る可能性も考えたリソース配分・スケジューリングを行う
- UICollectionViewCell, UITableViewCellでSwiftUIを使わない
Retty
- ほとんどがUIViewController + UIHostingControllerの構成
- 画面の一部からSwiftUIを適用していく形
- 画面遷移は基本的にUIViewController系統のものを使用して、NavigationLinkは使ってない
- 店舗詳細ページなどは、少しずつ施策開発や機能修正をする中でSwiftUIへの置き換えを進めている
- UITableViewはそのままでUITableViewCellにUIHostingControllerを持たせて、セルのコンテンツはSwiftUIのViewを表示する手法(不具合が発生するとの記載がある)
MIXI
- View+ロジック(アーキテクチャ)まで含めてSwiftUIに合わせて変更
- 画面遷移はUIKit
- UIがStateを監視して際レンダリングを行うアーキテクチャ
- MVVM + Clean Architectureへの変更(これ使ってる人多い)
Mockを作成する手間が省ける。
Previewの高速化。
ニフティ
- ViewControllerを使用してUIHostingControllerを介したSwiftUIを置く
- データ参照はObservableObject
- SwiftUIからViewControllerへのイベント受け渡しはdelegate
クックパッド
- VIPERベースのLayered Architecture
- View層のみでSwiftUIを使う
- 画面単位で完全に切り分けられているため、SwiftUIに困難が生じたらすぐにそこだけでもUIKitに戻せるリスク対策
- 画面(VIPERシーン)ごとに従来通りUIViewControllerがあり、そこに橋渡し役のUIHostingControllerを介して、SwiftUIで書かれたVIewが置かれる
- 遅延読み込み(LazyVStack, LazyHStack)の使用
まとめ
記事にしていただけるのは本当に感謝です!‥🙇
既存プロジェクトへ導入する際は再描画処理や、UIKitとの共存、アーキテクチャの選定など気をつけていきたいと思います!