2025/03/19 12:57 MVVM in SwiftUI for a Better Architecture

やあ、ロボ子。今日はSwiftUIにおけるMVVMパターンについて話すのじゃ。

MVVMですか、博士。確かModel-View-ViewModelの略でしたよね。SwiftUIに特によく合うと聞きますが。

そうじゃ、ロボ子。MVVMは、コードをモデル、ビュー、ビューモデルの3つに分割するアーキテクチャパターンなのじゃ。役割を分けることで、コードが整理されて理解しやすくなるのじゃ。

なるほど。モデルはデータとビジネスロジック、ビューはUI、そしてビューモデルがその橋渡し役ですね。

その通り!ビューモデルは`@Observable`クラスとして実装するのがオススメじゃ。グローバルなアプリの状態とか、ネットワークとの連携が必要になるからなのだ。

記事では、Hacker Newsのトップ10記事を表示するアプリを例にMVVMの実装を解説していますね。モデル層では、`Item`構造体でAPIのitemエンティティを表現し、`Decodable`プロトコルに準拠させていると。

`Decodable`を使うことで、JSON形式のデータを簡単に扱えるのじゃ。データ変換コードはビジネスロジックとしてモデル層に含めるのがポイントじゃ。

ビュー層では、`Entry`ビューが`Item`構造体から独立しているんですね。IntやStringなどのシンプルな型を使用することで、結合度を低く保つ、と。

そうじゃ、そうじゃ。ビューは必要な情報だけを表示するようにして、型同士の依存関係を減らすのが大事なのじゃ。

ビューモデル層では、`ViewModel`クラスが`@Observable`で、APIからデータを取得して`stories`プロパティを更新するんですね。`fetchTopStories()`と`fetchStory(withID:)`メソッドでAPIを呼び出す、と。

APIを叩いてデータを取得する処理は、ビューモデルの担当なのじゃ。そして、取得したデータを`stories`プロパティに格納することで、ビューが自動的に更新されるのじゃ。

記事では、MVVM以外にもMVCやMV、Clean Swift、Reduxなど、様々なアーキテクチャパターンを紹介していますね。

MVCはMVVMの仲間みたいなものじゃな。Clean Swiftとかはちょっとゴツい感じじゃけど、大規模なプロジェクトには向いているかもしれんの。

ReduxやComposable Architecture(TCA)は関数型プログラミングのパラダイムを強制するんですね。アプリケーションの状態を単一の構造に集中させるのは、ちょっと怖い気もします。

そうそう、状態管理が集中しすぎると、関係ないビューまで更新されてしまう可能性があるのじゃ。MVVMにも弱点があって、複雑なアプリではグローバルオブジェクトが必要になるから、MVVMだけでは解決できない問題もあるのじゃ。

なるほど。MVVMはあくまで一つの手段で、状況に応じて他のアーキテクチャパターンや設計原則と組み合わせる必要があるんですね。

そういうことじゃ!MVVMに厳密に従うだけでは解決できない問題もあるから、ルート層を追加することで、それらの問題に対処できるのじゃ。

勉強になります、博士!

ところでロボ子、MVVMって、まるでモデルさんがビューティーなメイクを施して、ビデオに映るみたいじゃな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
![MVVM in SwiftUI for a Better Architecture [with Example]](https://matteomanferdini.com/wp-content/uploads/2020/11/swiftui-mvvm-facebook.jpeg)