Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KMPプロジェクトでTCAを使わず、iOSのUIアーキテクチャを自作した話

Avatar for Nao Nao
October 08, 2026
0

 KMPプロジェクトでTCAを使わず、iOSのUIアーキテクチャを自作した話

Avatar for Nao

Nao

October 08, 2026

Transcript

  1. ViewModelが大きくなった View SwiftUI 操作 状態 ViewModel 基本情報の状態・処理 自己PRの状態・処理 職務経験の状態・処理 写真の状態・処理

    呼ぶ 結果 Model データ・ 業務処理 状態が複数のプロパティに分かれ、 変更の影響を追いにくくなった 08 / 21
  2. 単方向の状態管理の選択肢:TCA The Composable Architecture Point-Freeが開発するSwiftのオープンソースライブラリ。 単方向の状態管理、副作用管理、機能の合成、テストを支える 要素 役割 State Action

    Reducer Store 画面の表示や処理に使う状態 タップ、通信結果などのイベント 状態を更新し、実行する副作用を返す Actionを受け、Reducerや副作用を実行する 09 / 21
  3. View・Intent・Store・ViewState 操作 View SwiftUIの表示 操作を受ける send Intent 操作・イベント を表す 更新

    Store 処理を実行し、 状態を更新する ViewState 表示用の状態 Viewは状態を読み、変更に応じて表示を更新する 12 / 21
  4. TCAと似ているところ 役割 私たちの構成 TCA 状態 操作・イベント 状態更新・非同期処理 ViewState Intent Store内のメソッド

    State Action Reducer / Effect / Store 状態・操作・更新処理を分けると、似た役割が出てきた 副作用管理や、機能を合成する仕組みは異なる 13 / 21
  5. StoreとKMPをつなぐBridge Storeからは、Swiftの窓口を通してKMPを呼ぶ Store 処理を頼む 処理を依頼し、 結果で状態を更新 結果を返す Bridge SwiftのProtocol async

    throwsに変換 共有処理を呼ぶ 結果を返す KMP Command Query Featureモジュールは、Protocolだけに依存し、KMPを直接importしない テストはモックに差し替え、KMPのビルドを待たずに回せる 14 / 21
  6. 「気になる」操作で見る処理の順番 担当 処理 View Intentを送る Store 連打を防ぎ、Bridge経由で Commandを呼ぶ KMP DBとAPIを更新し、結果を返す

    Store 結果に応じてViewStateを更新する 上限超過なら、警告トーストを表示 追加前 追加後 15 / 21
  7. EffectTrackerを導入 Storeが起動した副作用を登録し、テストはすべて終わるまで待つ Store.swift 1 // 副作用のTaskを登録して起動する 2 effects.track(Task { await

    bridge.execute() }) StoreTests.swift 1 // 登録された副作用がすべて終わるまで待つ 2 await store.send(.screenAppeared) 3 await effects.waitUntilIdle() TCAのTestStoreと同じ発想を、この1点だけ取り入れた 17 / 21