目的
iOS開発における MVVM について知ること
(キーワード: データバインディング
, リアクティブプログラミング
, RxSwift
, Combine
)

MVVM とは?
データバインディング
という仕組みを使用したアーキテクチャです。(データバインディング👉超重要)
構造は M: Model
V: View
VM: ViewModel
となる。
画面の描画 = View と プレゼンテーションロジック = ViewModel を分離するためのアーキテクチャ。GUIアーキテクチャの1種。
ViewとViewModelをデータバインディング
という仕組みで関連づける。
ViewModelの状態変更に同期してViewの状態も更新され、画面に反映される。
データバインディングとは?
2つのデータの状態を監視し同期する仕組みのこと。
ViewModel のデータ変更を View が検知してデータを自動的に更新する。(逆もあり得る)
View, ViewModel の関係性が1方向の場合もあれば、双方向の場合もある。
なぜ データバインディング が使われるのか?
手続的な描画指示を書く必要がなくなり、宣言的なバインディングによって ViewModel自信の状態を更新するだけで Viewの描画処理が発火するため。
iOS開発で MVVM が使われる理由
関数型リアクティブプログラミング(Functional Reactive Programming: FRP)(※1)との相性が良いから。
FRP に特化した外部ライブラリとして RxSwift
がある。
RxSwift
を使用することで宣言的な記述をしながら複雑なバインディングを表現できる。
(※1): FRP は Modelの変更 や Viewの変更 が相互接続されてリアクティブに反応しあえる点と、手続き的ではなく宣言的にロジックを表現できる点 が評価されている
MVVM の構造

M: Model
UIに関連しない純粋なドメインロジックやそのデータを持つ。
MVC, MVP といった MVVM以外のGUIアーキテクチャの Model と同じ役割。
View や ViewModel がなくてもビルド可能である必要がある。
V: View
ユーザー操作の受付と、画面表示を担当する。
ViewModel が保持する状態とデータバインディングして、ユーザー入力に応じて ViewModel が自身が保持するデータを加工・更新することで、バインディングした画面表示を更新する。
VM: ViewModel (最重要)
3つの役割がある。
- View に表示するためのデータを保持すること
- View からイベントを受け取り、Modelの処理を呼び出すこと
- View からイベントを受け取り、加工して値を更新すること
画面表示のために必要な 状態 と ロジック を担うのが ViewModel である。
補足
次は RxSwift を使用して MVVM のプログラムを作成してみたいと思います!
LGTM, ストック してもらえると、とても嬉しいです 🙌
参考資料
[1], iOSアプリ設計パターン入門 (電子版: 税込3240円)