👌

SwiftUIでMVVM実装するならcombineよりもObservationで行こう

に公開

とある日に雑談で
「MVVMでcombineは使っているんですか?」
と聞かれて
「combineは使っていないです」
と回答すると怪訝な顔をされたので、ObservationでMVVMアーキテクチャを実現した簡単なSwiftUIサンプルアプリを書いたりしてみました。

Combineを使わずにApple's ObservationフレームワークでMVVM実装しています。
Apple's Observationフレームワークは、Combineよりも簡潔にMVVMパターンを実装できる方法を提供しています。

iOS 17から導入されたこのフレームワークにより、SwiftUIアプリケーションのコードがより簡潔になります。
最近ではTCA(The Composable Architecture)に移植する流れもありCompose対応をある程度済ませいている場合はcombineを利用しない「Observation + TCA + DI(Swinject)」によるUI実装が比較的コードの保守性や分離レベルも都合よくまとまり、好みではあります。
あくまでも好みの世界の話なので、どうしてもcombineでMVVM実装するのが正義と考える人と不毛な議論をしたい訳でもありませんので、そちら側の方々はお好きなようにされたら良いと思います。

Observationフレームワークの利点

ObservationフレームワークはiOS 17で導入され、これによりCombineを使わずにSwiftUIアプリを構築できるようになりました。 ObservationフレームワークとSwift Concurrencyの機能を組み合わせることで、Appleによって非推奨となりつつあるCombineフレームワークを置き換えることができます。

Observationの簡潔さ

MVVMパターンをSwiftUIに導入するには、プログラムの状態とロジックをビュー構造体から分離します。基本的には、ロジックとレイアウトを分離するということです。
Observationを使うと、この分離がより簡単になります。

実装の違い

Combineを使用したMVVMでは:

  • ObservableObjectプロトコルとPublishedプロパティラッパーを使います
  • StateObjectやObservedObjectなどの追加のプロパティラッパーが必要

Observationを使用したMVVMでは:

  • @Observableマクロを使用するだけで済みます
  • SwiftUIでは@Stateプロパティラッパーを使用して、以前のStateObjectの代わりにObservable型を管理できます
  • SwiftUIのビューモデルは@Observableクラスとして実装され、ビュー内で@Stateプロパティとして保持されます

それではObservationを使ったMVVMのチャットアプリの実装を示します:

上記のコードは、iOS 17から導入された@Observableマクロを使用したMVVMパターンのWebSocketチャットアプリケーションです。
Combineの代わりにObservationフレームワークを使用することで、コードがより簡潔になっています。

Observation vs Combineの主な違い

  1. より簡単な実装

    • CombineでのMVVM実装:ObservableObjectプロトコルに準拠し、@Publishedプロパティラッパーを使用
    • Observationでの実装:@Observableマクロを使用するだけ
  2. プロパティラッパーの簡素化
    SwiftUIでは@Stateプロパティラッパーで、以前は@StateObjectを使っていた場所にObservable型を管理できるようになりました。

  3. 自動追跡機能
    SwiftUIは自動的にObservable型のプロパティの変更を追跡するため、ビュー内でプロパティ変更を観察するための特別な関数を使う必要がありません。

実装の重要ポイント

  1. ViewModelクラスの定義

    @Observable class ChatViewModel {
        // プロパティとメソッド
    }
    
  2. ViewでのViewModel使用法

    // @StateObjectではなく@Stateを使用
    @State private var viewModel = ChatViewModel()
    
  3. バインディングの簡素化

    • Observationでは、プロパティの変更が自動的に検出されるため、特別なパブリッシャーやサブスクリプションが不要

利点

  1. コードの簡潔さ
    ObservationフレームワークはSwiftUIアプリのコードを大幅に簡略化します。

  2. パフォーマンス
    Observationは堅牢で型安全、かつパフォーマンスの高いObserverデザインパターンの実装を提供します。

  3. 将来性
    Observationは将来的にSwiftUIアプリ構築の標準になると考えられています。

この実装方法はiOS 17以降でのみ使用可能ですが、Combineを使用したMVVM実装よりもコードが簡潔になり、メンテナンスが容易になります。
Observationを使うことで、MVVMアーキテクチャのメリットを享受しつつ、よりシンプルな実装が可能になります。

サンプルに準備したObservationで実現したチャットアプリは機会やニーズがあれば、どこかのタイミングで公開しようと思います。
特になければ懐に温めておこうかと

それではまた

Discussion