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
65
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
2
1k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
380
ネイティブiOSアプリだからできること
yuukiw00w
0
52
野瀬田とSwift愛好会
yuukiw00w
0
41
uhooiさん発ランダムタスクにチャレンジしよう!
yuukiw00w
1
87
Validate your App Intents adoption with AppIntentsTesting
yuukiw00w
0
62
App Intentsを実装しよう
yuukiw00w
0
63
iOS26時代の新規アプリ開発
yuukiw00w
0
280
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
420
Other Decks in Programming
See All in Programming
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
280
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.8k
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
140
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
260
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
320
No More NoSuchMethodError
exoego
1
110
Groovy as a human and AI friendly programming language
paulk
0
110
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
340
JIS keyboard support in Omarchy
lef237
0
160
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
1.9k
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
1k
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
370
Featured
See All Featured
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Technical Leadership for Architectural Decision Making
baasie
3
610
The Pragmatic Product Professional
lauravandoore
37
7.5k
Making Projects Easy
brettharned
120
6.8k
Google's AI Overviews - The New Search
badams
0
1.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
500
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
610
Color Theory Basics | Prateek | Gurzu
gurzu
1
500
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
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種類あんねん
おわり