最強のKMM構成をiOS対応した
以前書いたこの記事ですが、この時点ではiOS対応が終わっておらず、
iOSアプリが動く状態になるまでに苦労があったのでiOS対応部分をメインに書きます。
※前回も書きましたが、iOS開発もSwiftも全く分からない(Swift書くの初めて)人間なので、ご注意ください
間違いなどあれば、優しく遠慮なく教えてくれると喜びます。(細かいことでも歓迎です)
# モジュール構成
前回の記事でも書きましたが、モジュール構成はざっくりこのような形です。
角丸が共通化されているモジュールで、四角がネイティブです。
ViewModelまで共通化してしまい、ネイティブ実装はUIをメインに行う状態にすることを目標としていました。(今のところ達成しました)
Flowの対応
せっかくKotlinを使っているので基本的にはFlow使いたい気持ちになります。
なので、参考にしたプロジェクトから拝借です。
人によってFlowをどうiOSアプリに取り込むか色々なアプローチをされているように見えたので、Githubを漁ってみると楽しそうです。
ViewModelをObservableObjectにする
先にSwiftはseald classを扱い辛い問題を対応しました。
Stateを管理するクラスを用意します。
※Swift何も分からないので、可能なかぎりKotlinで書くように逃げたとも言えます。
次にViewModelをObservableObjectに変換する処理を用意します。
ViewModelを修正
swStateと言うSwift用のStateFlowを用意しました。
また、ここでNow in Androidで使われているResultから上記のState管理クラスにmapしています。
画面表示
こちらは特に面白くないと思います。
iOS用の特別対応まとめ
- KoinのInject関連の設定を書く
- sharedモジュールで参照していないクラスはiOS用にクラスを定義してくれないため、無駄に宣言だけ追加する
https://github.com/sobaya-0141/Sample202209/blob/master/shared/src/iosMain/kotlin/sobaya/app/sample202209/Helper.kt
専用のStateクラスを用意しましたが、下記のライブラリを含めて様々なアプローチがあると思うので、好きな方法を選んでもらうといいと思います。
- Now in AndroidのResultを使わない(enumだったり、data classだったり)
- seald classをそのまま使う
- 下記ライブラリを使う
https://github.com/icerockdev/moko-kswift
2022/10/24追記
こちらのPRでseald classをenumに変換してくれるライブラリを導入して
Swiftの実装をしました。
ソースコード
参考アプリ
アプリの構成やソースコードなどかなり参考にしました(むしろこっちを見るだけで良い説)
Discussion