【Swift】Core Dataの設定。カスタムクラスを作ってエンティティの属性へのアクセスを簡潔にする。(Swift 2.1、XCode 7.2)

2020年6月16日

Entityの設定

本記事は、前回記事「Entityの設定」の続きである。⇒「前回記事

Entityの設定

 

Class

管理オブジェクトコンテキストが管理するデータはNSManagedObjectクラスのインスタンスとしてメモリ上に展開される。このNSManagedObjectクラスを継承したクラスをカスタムクラスとして設定することができる。

カスタムクラスを使う大きな利点は属性値へのアクセスが簡潔に記述できることだ。

例えば、カスタムクラスを使わない場合、オブジェクトの属性値にアクセスするには以下のコードのように属性名の文字列を与えるが、

 

カスタムクラスを使うと、以下のコードのようにインスタンス変数のプロパティとして属性値にアクセスすることができる。

記述がシンプルになるし、プロパティ名を間違ったらコンパイルエラーで教えてくれるので、こちらの方が安心してコーディングできる。

 

実際にカスタムクラスを作ってみよう。

以降の手順を開始する前のXcodeプロジェクトをGitHubに置いたので、試してみる人はご利用されたし。
⇒「テスト用プロジェクト

事前準備では、テキストフィールドの文字列をCore Dataで保存、読込みするものを実装しておいた。

下図赤枠の「プロジェクト名.xcdatamodeld」を選択したあと、メニュー⇒「Editor」⇒「Create NSManagedObject Subclass」とたどる。

エンティティのサブクラスを作成する

 

データモデルの一覧が表示されるので、「プロジェクト名」にチェックが入っていることを確認して「Next」ボタンを押す。

カスタムクラスを作るデータモデルを選択する

 

データモデルに定義されているEntityの一覧が表示されるので、Playerにチェックが入っていることを確認して「Next」ボタンを押す。

カスタムクラスを作るエンティティを選択する

 

保存先を指定する画面が表示されるので、プロジェクトのフォルダが指定されていることを確認して「Create」ボタンを押す。

保存先を指定する

 

すると、「Player.swift」と「Player+CoreDataProperties.swift」の2つのファイルが作られる。これがカスタムクラスのファイルである。

カスタムクラスが2つ作られた

 

Player.swiftは、NSManagedObjectクラスを継承したPlayerクラス。最初はプロパティやメソッドは何もない。Playerクラス固有の実装をここにコーディングしていく。

 

Player+CoreDataProperties.swiftは、Playerクラスを拡張したクラス。⇒「拡張とは

ここにエンティティの属性がプロパティとして定義される。なお、Playerエンティティの定義を変更して再度サブクラスを作ると、「Player+CoreDataProperties.swift」が更新され、「Player.swift」は更新されない。

2つのファイルが存在する理由は、エンティティの定義を変更したあとのサブクラス再生成で開発者がコーディングした実装箇所が上書きされないためである。

 

下図赤枠の「プロジェクト名.xcdatamodeld」を選択、黄緑枠の「Player」を選択、紫枠のデータモデルインスペクタボタンを押して設定画面を表示し、Classの設定を確認すると、作成したカスタムクラス名が自動で設定されていることが分かる。親切に設定してくれてありがとう。

カスタムクラス作成後のEntityのデータモデルインスペクタ

 

ViewController.swiftを以下のコードに変更する。

管理オブジェクトコンテキストから取得したオブジェクトをPlayerクラスにキャストし、nameプロパティに対して値を設定、取得するようにした。

 

以下は実際のプレイ動画。属性へのアクセス方法を変えただけなので、動きは変更前と同じである。

 

Module

Classで指定したカスタムクラスが存在するモジュールを指定する。モジュールとは、プロジェクトをビルドしたものやフレームワークのことをいう。

現在のプロジェクトの中にカスタムクラスを作る場合は「Current Product Module」に設定する。Classと同様に、カスタムクラスを作ったときにこの項目も自動で設定される。