概念

とはいえ、概念はほとんどこれで理解できた。覚えていられないので何度も見ているが、使っていくうちに暗記が理解に追いつくはず。

やっとわかったSwift/CoreData入門 【part1:概念編】 - Qiita

正確に言うと: モデルオブジェクトを永続化するためのフレームワーク(O/Rマッピングフレームワーク)

簡単に言うと: Xcode上から簡単にDBのようにデータ構造を設定できたり、アプリ上で扱うデータを保存、削除、更新するプログラムを簡単に書けるようになる仕組み

あとはネット記事中の具体例をまず真似てから、それを参考に自分のコードへと実装していく。

以下、上記概念解説記事を読んでいること前提で話していく。

具体例(基本)

ただ具体例を試すだけなら新しくProjectを立ち上げればよかったかもしれないが、既存のProjectにCoreDataを作りたかったのでProject作成時にCoreDataを使うチェックがなかった場合を先に述べておく。

[Xcode9] 既存プロジェクトにCoreDataを追加する方法 - Qiita

この記事のように、CoreDataチェック付きProjectのSceneDelegateとAppDelegateの中身をパクればよい。記事時点の環境との違いを考慮して、自分で行う場合は自分の環境でまずCoreDataチェック付きProjectを立ち上げて、その中身をコピーしたほうが良い。

閑話休題。とはいえ(2回目)、1点のつまづきさえなければ具体例もこれで問題なく試せる。ちなみに作成するEntityは1つのみである。

やっとわかったSwift/CoreData入門 【part2:とりあえず実装編】 - Qiita

ご親切に「つまづきポイント」と書いて対策も示されているが、順番としては

  1. 何より先にEntityを定義
  2. 直後にBuild(⌘B)
  3. プログラムを実装

じゃあこれをわずかでも守らなかったら?まあ実際順番がどうだったか正確なところは覚えていないが、とにかくコード上で

var モンスターオブジェクトの配列:[Monster] = []

を書こうとしたときにMonsterが変換候補に出ない。直打ちしてもそんなClassはないと怒られる。Buildしても変わらない。⇧⌘Kで「Clean Build Folder」してからBuildしてもノン。

よーわからんがとりあえず自分の環境では無理ってこと?と勘違いして、別の具体例を探してググったら、【Swift】Core Dataを使って情報を保存/取得する - Swift・iOS。これは丸パクリしてもエラーが出なかった。

それはともかく、上記のように順番を守らなかったりしてエラーが消えない場合は、⇧⌘Kしたあとに安定のXcode再起動。で⌘B。そしたらMonsterがClassとして認識された。

具体例(応用)

これまでの具体例ではEntityが1つだけだったが、たとえば2つの場合はどうなるのか?それらに依存関係があったらどう実装するのか?あとついでにCoreDataのインスタンス生成やデータ読み込み等をどうメソッドにして使い回すのが便利かなって考える際に参照できる記事がこれ。

【Swift】Core Dataの基本的な使い方 | 2速で歩くヒト

以上より、これまた参考になりやすい。

おまけ

途中ちらっと紹介した【Swift】Core Dataを使って情報を保存/取得する - Swift・iOSも具体例として使えるが、若干ユニークな実装をしている。rootViewControllerつまりSimulatorで最初に表示される画面だと思っているがそこにPersistentContainerを紐付けており、その実装をSceneDelegateで記述している。

まったく記事は悪くないが、よく理解しないまま丸パクリしてエラーが出なかったのでこれをベースに実装していたらrootViewControllerとして設定していたView Controllerとは別のView ControllerにNavigation ControllerをEmbedした結果、エラーの原因もわからず苦労した。という話は昨日の記事であげた。

まとめ

結局どう説明されても馴染みはないし用語は長いしで、具体例を参考にしつつ、自分のコードを実装しながら理解と記憶していくことが重要だと改めて思い知った。

続き

CoreData:データの更新について(Xcode12.4、Swift 5.3.2)(April 21, 2021)に続きあり。