🍣

最強のKMM構成をiOS対応した

2022/10/21に公開

以前書いたこの記事ですが、この時点ではiOS対応が終わっておらず、
iOSアプリが動く状態になるまでに苦労があったのでiOS対応部分をメインに書きます。
https://zenn.dev/sobya/articles/ca4a44b13bd6a4
※前回も書きましたが、iOS開発もSwiftも全く分からない(Swift書くの初めて)人間なので、ご注意ください
間違いなどあれば、優しく遠慮なく教えてくれると喜びます。(細かいことでも歓迎です)

# モジュール構成
前回の記事でも書きましたが、モジュール構成はざっくりこのような形です。
角丸が共通化されているモジュールで、四角がネイティブです。

ViewModelまで共通化してしまい、ネイティブ実装はUIをメインに行う状態にすることを目標としていました。(今のところ達成しました)

Flowの対応

せっかくKotlinを使っているので基本的にはFlow使いたい気持ちになります。
なので、参考にしたプロジェクトから拝借です。
人によってFlowをどうiOSアプリに取り込むか色々なアプローチをされているように見えたので、Githubを漁ってみると楽しそうです。
https://github.com/sobaya-0141/Sample202209/blob/master/iosApp/iosApp/FlowPublisher.swift

ViewModelをObservableObjectにする

先にSwiftはseald classを扱い辛い問題を対応しました。
Stateを管理するクラスを用意します。
※Swift何も分からないので、可能なかぎりKotlinで書くように逃げたとも言えます。
https://github.com/sobaya-0141/Sample202209/blob/master/features/src/commonMain/kotlin/sobaya/app/features/randomDog/grid/SwRandomDogGridState.kt

次にViewModelをObservableObjectに変換する処理を用意します。
https://github.com/sobaya-0141/Sample202209/blob/master/iosApp/iosApp/RandomDogGridViewModelObservableObject.swift

ViewModelを修正

swStateと言うSwift用のStateFlowを用意しました。
また、ここでNow in Androidで使われているResultから上記のState管理クラスにmapしています。
https://github.com/sobaya-0141/Sample202209/blob/master/features/src/commonMain/kotlin/sobaya/app/features/randomDog/grid/RandomDogGridViewModel.kt

画面表示

こちらは特に面白くないと思います。
https://github.com/sobaya-0141/Sample202209/blob/master/iosApp/iosApp/ContentView.swift

iOS用の特別対応まとめ

専用のStateクラスを用意しましたが、下記のライブラリを含めて様々なアプローチがあると思うので、好きな方法を選んでもらうといいと思います。

2022/10/24追記
こちらのPRでseald classをenumに変換してくれるライブラリを導入して
Swiftの実装をしました。
https://github.com/sobaya-0141/Sample202209/pull/40

ソースコード

https://github.com/sobaya-0141/Sample202209

参考アプリ

アプリの構成やソースコードなどかなり参考にしました(むしろこっちを見るだけで良い説)
https://github.com/Kashif-E/KMMNewsAPP

Discussion