[SwiftUI][CoreData] SwiftUI と MVVM で始める CoreData 入門 (その8:リファクタリング)

SwiftUI と CoreData を組み合わせたアプリの作り方を説明します。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Catalina 10.15.7
  • Xcode 12.2
  • iOS 14.2

リファクタリング概要

いろいろとコードを変更してきて、気になる点が増えてきたので、少し大規模に Refactoring します。

以下の点を直したいと考えてます。

  • ContentView をやめたい
  • TODOItem の isDone を操作する ViewModel のメソッド名 (toggleDone) を筆頭にメソッド名が不自然なものが多い
  • 変更のある箇所で、self.todoItems = self.todoItemStore.filteredItems(predicate) してるのをスマートにしたい

以下は、気になるけど まだ修正しないで置いて、必要性が高まったら改めて考えようと思っている点です。

  • 常に、CoreData 変更を行い、そこから Swift の Model を再生成しているのは、パフォーマンス的にOK?

ContentView をリネーム

非常に単純です、Xcode の機能を使用してリネームします。MyTODOMainView としました。

以下は具体的な手順です。

  1. Cmd + U で全てのテストを行い、パスすることを確認
  2. ContentView.swift 中の ContentView を選択し、コンテキストメニュー[Refactor]-[Rename…] を選択
  3. 関係する箇所が同時に表示され、見ながら変更できます。
  4. Cmd + U で 再度 全てのテストを行い、パスすることを確認したら、Commit。

Xcode の Refactoring メニューは、ファイル名まで変更してくれるので、便利です。

メソッド名の調整

isDone のフラグを toggle させるメソッドは、toggleIsDone とすることにします。

Model, ViewModel いずれにも相当するメソッドがありますが、統一しました。

そのほかにも、統一感がなかったので、統一することにしました。

ViewModel 内の todoItems の更新

これまでは、変更操作を行うメソッドの中で、直接 更新していました。

ある意味直感的ですが、忘れることが懸念されます。

ということで、自動化します。

基本的に、CoreData を変更したら todoItems を更新させることにします。

CoreData を変更すると、NotificationCenter から NSManagedObjectContextObjectsDidChange なる notification が送信されますので、それを契機に todoItems を更新することにしました。

ここまでに作ってきたコード

以下のファイルを作ってきました。

MyTODOModel.swift
Model 定義ファイル
MyTODOViewModel.swift
ViewModel 定義ファイル
MyTODOMainView.swift
View 定義ファイル
TODOItemView.swift
TODOItem 表示 View 定義ファイル
MyTODOApp.swift
App 定義ファイル
MyTODO.xcdatamodeld
CoreData モデル定義ファイル

MyTODOModel.swift

MyTODOModel.swift

MyTODOViewModel.swift

MyTODOViewModel.swift

MyTODOMainView.swift

MyTODOMainView.swift

TODOItemView.swift

TODOItemView.swift

MyTODOApp.swift

MyTODOApp.swift

MyTODO.xcdatamodeld

CoreData モデル定義
CoreData モデル定義

次回は、既存の TODOItem を編集できるようにします。

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です