Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ViewModelって200種類あんねん
Search
野瀬田 裕樹
August 09, 2026
Programming
56
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ViewModelって200種類あんねん
集まれSwift好き!Swift愛好会 vol.98
野瀬田 裕樹
August 09, 2026
More Decks by 野瀬田 裕樹
See All by 野瀬田 裕樹
速習iPhone Duo対応
yuukiw00w
1
520
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
220
ネイティブiOSアプリだからできること
yuukiw00w
0
29
野瀬田とSwift愛好会
yuukiw00w
0
35
uhooiさん発ランダムタスクにチャレンジしよう!
yuukiw00w
1
74
Validate your App Intents adoption with AppIntentsTesting
yuukiw00w
0
51
App Intentsを実装しよう
yuukiw00w
0
53
iOS26時代の新規アプリ開発
yuukiw00w
0
270
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
390
Other Decks in Programming
See All in Programming
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
120
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
270
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
190
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
690
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
1.9k
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
130
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
300
Heart of Swift Concurrency
koher
0
880
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
7.3k
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
180
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
280
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
240
Featured
See All Featured
A Soul's Torment
seathinner
8
3.6k
Speed Design
sergeychernyshev
33
2.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Practical Orchestrator
shlominoach
192
12k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Fireside Chat
paigeccino
43
4k
Building Applications with DynamoDB
mza
96
7.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
590
Why Our Code Smells
bkeepers
PRO
340
58k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Transcript
ViewModelって 200種類あんねん 合同会社DMM.com アプリ開発室 野瀬田 裕樹(@ynoseda)
あなたは ViewModelとは何か 答えられますか?
最初のViewModel
最初のViewModel • 2005年にJohn Gossman氏がMVVMを発表 • その中でViewModelについて語られている
最初のViewModel モデルに直接データバインドできるのはアプリケーションUIのごく一部に限られます。 特に、モデルが既存のクラスまたはデータスキーマであり、アプリケーション開発者が制御できな い場合はなおさらです。 モデルには、コントロールに直接マッピングできないデータ型が含まれている可能性が非常に高い です。UIは、ビューの厳密な定義では意味をなさないものの、モデルに含めるには特殊すぎる(あ るいは既存のモデルに含まれていない)コードで実装する必要がある複雑な操作を実行したい場合 もあります。 最後に、選択やモードなどのビューステートを配置する場所も必要です。 ViewModelはこれらのタスクを担います。
ViewModelとは「ビューのモデル」を意味し、ビューの抽象化と考えることができますが、View がデータバインディングに使用できるモデルの特殊化も提供します。 この後者の役割において、ViewModelには、モデル型をView型に変換するデータトランスフォー マーと、Viewがモデルと対話するために使用できるコマンドが含まれています。
ViewModelという名前の意味 • Viewを抽象化したもの • Viewがデータバインディングで利用できるように、 Modelを特化させたもの
最初のViewModelの役割 • ModelをそのままUIにバインドできない問題を解決する • UIロジックを配置する場所を提供する • Viewの状態を保持する • ViewがModelを操作するためのインターフェースを提供する
MVVMといえば • Androidでは標準でViewModelというclassが存在します • 比較のため、AndroidでのVMの役割を確認してみましょう
Android ViewModel ViewModel クラスは、ビジネス ロジックまたは画面レベルの状態ホ ルダーです。 状態を UI に公開し、関連するビジネス ロジックをカプセル化しま
す。 状態がキャッシュに保存され、構成が変更されてもそれが維持される ことが主なメリットです。 つまり、アクティビティ間を移動するときや、画面の回転などの構成 の変更に従うときに、UI でデータを再度取得する必要がありません。
Android ViewModelの役割 • ModelをそのままUIにバインドできない問題を解決する • UIロジックを配置する場所を提供する • Viewの状態を保持する(+それをキャッシュする) • ViewがModelを操作するためのインターフェースを提供する
Android ViewModelの役割 • ModelをそのままUIにバインドできない問題を解決する → 通常RepositoryでUIが扱えるデータ型にする • UIロジックを配置する場所を提供する • Viewの状態を保持する(+それをキャッシュする)
• ViewがModelを操作するためのインターフェースを提供する → ビジネスロジックはUseCaseで提供し、VMがそれを叩く
補足 Android公式のアプリアーキテクチャーガイドでは MVVMとは書いてません あくまでVMはUIレイヤーのState holdersの一例となっている
iOSにおけるMVVM • 正式なものはない • アプリごとによってViewModelの役割は異なる • VMについて見る前にMVVM以外のアーキテクチャーを確認しよう
Cocoa MVC • 伝統的なAppleのMVCアーキテクチャー https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html • UIロジック、データ取得、状態管理、画面遷移、ログ送信など多くの実装がVCに含まれてし まい、FatViewController問題を引き起こしがちだった User操作 描画更新
View View Controller データ更新 通知 Model
MVP • 特にApple公式でMVPに触れたことはないはずだが、 一部アプリでPresenterを採用している • MVPにはPassive View / Supervising Controllerの2種類がある
• 今回の本題はMVVMなので詳細は割愛するが、 ViewにVCを含めて考え、UIロジック等をPresenterに実装する設計などが考 えられる View Presenter Model
VIPER • View + Interactor + Presenter + Entity +
Routerの頭文字 • ビジネスロジックをInteractorに置き、画面遷移をRouterが担う • MVPにおけるPresenterの責務の一部が分割されていることが特徴
その他のアーキテクチャー • Flux/Redux系 FluxやReduxを参考に独自設計を採用しているケースがある • TCA(The Composable Architecture) 有名なので採用しているアプリも多いと思われる •
MV(Model - View) AppleのサンプルリポジトリではViewとModelしかないことも多い
その他のアーキテクチャー • 最近は Presenter, ViewModel, ViewController のようなものを 持たない設計も多い • ViewModelが従来担おうとしていた責務が分割、整理されて
命名されている
iOSにおけるMVVM • MVVMもApple公式の定義はないため、 ViewModelの役割はプロジェクトごとに変わる
例1:UIKit時代のVM • UIViewController + UIView + ViewModel + Model構成 •
UIロジック、Viewの状態保持、Modelの操作IFの提供、 バインドできる形でのModelの提供などをVMに持たせられる • 最初のViewModelと近い役割での導入が期待できる
例2:UIKit時代のVM • VC + View + VM + Repository +
Model構成 • ModelをそのままUIにバインドできない問題はRepositoryが Publisherを公開するなどの形で委譲し、 ViewModelはその他の役割に専念する • ViewModelの肥大化に対応するため一部責務を切り出した状態
例3:UIKit時代のVM • VC + View + VM + UseCase +
Repository + Model構成 • VMはUIロジックを配置する場所を提供したり、 Viewの状態を保持したりするのに専念し、 その他をUseCaseやRepositoryなどに切り出した構成 • Androidにおける設計と近い構成になる
UIKit時代のMVVM • 同じ ViewModel という名前でもプロジェクトによって役割は様々 • UIロジック、状態管理、副作用管理、データ変換、画面遷移、etc • 全部盛りのVMもあれば、状態の保持に徹するVMもある •
ViewModel は複数の責務の組み合わせで成り立つ
SwiftUI.View • SwiftUI.ViewはUIを実際に描画するわけではなく、 どのようにUIが構成されるべきかを記述したもの • Viewを抽象化したものであり、 状態を@Stateで保持してModelをバインドできるようになっている
SwiftUI.Viewは 状態を保持して Viewがbindできるようにする
最初のViewModelのコンセプトと かなり近い存在では?
SwiftUI.ViewとViewModel • SwiftUI.Viewはほとんど最初のViewModelのコンセプトと同等 • ただ、 View に VM の責務を全部任せると辛いという気持ちもある •
例えば 「UIロジックを配置する場所を提供する」 「ViewがModelを操作するためのインターフェース」 ここら辺は切り出してView以外で実装しても良さそう
SwiftUI.ViewとViewModel • そうしてViewから切り出したものをViewModelと呼んでもいい
SwiftUI.ViewとViewModel • そうしてViewから切り出したものをViewModelと呼んでもいい (し、UseCaseとか別の名前で切り出してもいいし、
SwiftUI.ViewとViewModel • そうしてViewから切り出したものをViewModelと呼んでもいい (し、UseCaseとか別の名前で切り出してもいいし、 あとは全部Modelですって言ってもいいし、)
SwiftUI.ViewとViewModel • そうしてViewから切り出したものをViewModelと呼んでもいい (し、UseCaseとか別の名前で切り出してもいいし、 あとは全部Modelですって言ってもいいし、 表示ロジックだからPresenterですって言ってもいいかも)
まとめ • 元々のViewModelには色々な責務があった • iOSは公式のMVVMガイドなどはないので、 チームごとにViewModelが担う責務は違う • SwiftUIの登場でViewModelの責務の一部がViewに任せられるよう になり、チーム内でViewModelの責務を明確にする必要性が増した
言葉遊びにならないように チームでViewModelの役割を 明確にしよう
ViewModelは1つではない 責務の組み合わせ次第で いくらでも形が変わる
だから ViewModelって 200種類あんねん
おわり