本リポジトリは、iOSのMVVMアーキテクチャを採用したサンプルコードである。 MVVMアーキテクチャを採用したコードの形は、開発チームによって、人によって異なり、公式で定義されていない。 このリポジトリのMVVMは、以下のサイト・本などに参考にし、独自に定義したものである。
- https://medium.com/macoclock/an-overview-of-the-mvvm-design-pattern-ee0293663e1f
- https://speakerdeck.com/sansanbuildersbox/architecture-to-support-eight-ios-2
- https://peaks.cc/books/iOS_architecture
- https://yktech.hatenablog.com/entry/2019/01/03/234757
このリポジトリはあくまでMVVMの一例であり、これを見た人で意見があれば、ぜひissueでコメントして欲しい。
iOSのMVVMとは、Model, ViewController, ViewModelの3つの層に分けた、 アーキテクチャ構造のことを指す。
本リポジトリでは、以下の図の構造を意識している。
以下補足。
- ViewController層: UI層。画面遷移などUI操作を行うが、ロジックは持たない。ViewControllerだけでなく、Viewクラスも含む。
- ViewModel層: UI層のビジネスロジックを持ち、加えてModel層のデータ連携ロジック(API取得データをローカルに保存するなど)を持つ層。Model層のビジネスロジックをUseCase層が持つMVVMアーキテクチャのケースもあるが、UseCase層があると頻繁にコード内容が薄くなり、レイヤーが増えるのでコード全体でみると見通しが悪くなりかねないので、本リポジトリではViewModel層に統合する形を採用した。UnitTestの対象。
- Model層: データの管理や操作を行う層。
- Entity: オブジェクトクラス。UnitTestの対象。
- Repository: ローカルデータの読込・検索・削除・更新などを行うクラス。UnitTestの対象。
- APIClient: APIアクセスを行うクラス。
- DIについて: ViewModelをテストしやすくするために、ViewModelのInitializerにはDIを採用している。Mockの指定を行う場合は、MockインスタンスをViewModelのInitializer変数に適用する。
※注意点: ViewModel層では、ViewControllerの状態を知らない。そのため、ViewControllerのインスタンスも持たないようにする。
MVVMアーキテクチャを採用したシステム、以下の機能を実現している。
APIのGET・POST・DELETE・PUTを学ぶために。
- Itemの一覧表示・削除: ItemViewControllerなど
- Itemの登録・更新: ItemRegisterViewControllerなど
アイテム一覧 | アイテム登録 | アイテム削除 | アイテム更新 |
---|---|---|---|
複数のAPIの扱いを学ぶために。 Githubのリポジトリ一覧取得APIでお気に入り登録したもの、 Qiitaの記事一覧取得APIでお気に入り登録したものを、まとめて一覧で表示する。
- GithubリポジトリとQiita記事のお気に入り表示: ListViewControllerなど
- Githubのリポジトリ一覧取得とお気に入り登録: GithubViewControllerなど
- Qiitaの記事一覧取得とお気に入り登録: QiitaViewControllerなど
お気に入りリスト | Github検索 | Qiita検索 |
---|---|---|
ローカルデータの扱いを学ぶために。 新規登録・ログインは、UrlSchemeとUniversalLink周りも学べるLINEログインを採用した。
- 新規登録・ログインへの導線、ユーザ情報の表示: MypageViewControllerなど
マイページ 未ログイン | マイページ ログイン済み | ユーザ情報入力 |
---|---|---|
- Rx系: ViewModelのbindingを実現するために
- RealmSwift: ローカルデータを管理しやすくするために
- PINRemoteImage: 画像を取得しやすくするために
- Alamofire: APIアクセスしやすくするために
- LineSDKSwift: LINEログインのために
- SwiftLint: 静的解析ツール
- R.swift: imageやstoryboardなどのtypo防止
詳しい説明はReadmeには記載しない。 コードにコメントを書いたりしているので、コードを見て欲しい。