【Swift】Core Dataの設定。エンティティの属性の型、範囲、初期値を設定する。(Swift 2.1、XCode 7.2)

2020年6月16日

Attributeの設定

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

Attributeのデータモデルインスペクタ

 

Optional

必須項目、任意項目のどちらにするかの設定。チェックを入れると任意項目になり、値を設定しなくてもエラーは発生しない。デフォルトはチェックが入っている。

チェックを外して必須項目にした場合は、値を設定しないとデータを保存する段階で以下のエラー(Code=1570)が発生する。

Error Domain=NSCocoaErrorDomain Code=1570 “The operation couldn’t be completed. (Cocoa error 1570.)"

 

indexed

チェックを入れると、この属性のインデックスが生成される。インデックスについては次の記事も参照されたし。⇒「インデックスとは

 

Attribute Type

属性の型を指定する。型によってValidationに設定できる項目が変わる。

下表は設定可能な型の一覧。

設定名 設定値 Validation
1 Undefined 未設定 無し
2 Integer 16 整数(-3万から3万) -32768 ~ 32767 範囲、初期値
3 Integer 32 整数(-21億から21億) -2147483648 ~ 2147483647 範囲、初期値
4 Integer 64 整数(-922京から922京) –9223372036854775808 ~ 9223372036854775807 範囲、初期値
5 Decimal 10進型 範囲、初期値
6 Double 不動小数点(有効桁数は約15桁) 範囲、初期値
7 Float 不動小数点(有効桁数は約7桁) 範囲、初期値
8 String 文字列 文字列長、初期値、正規表現
9 Boolean 真理値(trueまたはfalse) 初期値
10 Date 日付 日付範囲、初期日付
11 Binary Data バイナリデータ
12 Transformable NSData型に変換可能なオブジェクト

 

上記表のValidationについて説明する。

動作確認をするのに使ったXCodeのプロジェクトをGitHubに置いたので試してみる人はご利用されたし。
⇒「テスト用プロジェクト

使い方は、ピッカーで保存する型を選択し、テキストフィールドに値を入力する。「保存」ボタンを押すとCore Dataを使ってデータが保存され、「読込」ボタンを押すと保存したデータがデバッグエリアに表示される。

以下はViewController.swiftのソースコード。動作確認用なので処理効率やエラーハンドリングについては考慮していない。

 

範囲(Minimum, Maximum)

設定できる値の範囲を指定する。

例えば、下図赤枠のように型がInteger 16の属性に、最小値に100、最大値200のValidationを設定し、300を保存しようとするとエラーが発生して保存に失敗する。

指定した範囲を超えた値を保存しようとしてエラー

 

以下はエラーメッセージ

NSValidationErrorKey=testInteger16, NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1610.), NSValidationErrorValue=300}

 

初期値(Default)

オブジェクト生成時の属性の初期値を指定する。

 

文字列長(MinLength, MaxLength)

属性に設定できる文字列の文字数の範囲を指定する。

 

正規表現(Reg. Ex.)

属性に設定できる文字列の正規表現を指定する。例えば、先頭に「TEST」がついている文字列のみ設定できるようにしたい場合は「TEST.*」になる。

 

日付範囲(Minimum Value, Maximum Date)

属性に設定できる日付の範囲を年月日時分秒で指定する。なぜか最小の項目名が「Value」、最大の項目名が「Date」になっている。修正される前に記念スクショを撮っておこう。

Attributeの日付設定

 

その他の留意事項について以下に説明する。

Decimalについて

Decimalを簡単に言うと、大きな桁数を符合付きで正確に保存できる型である。DoubleやFloatの不動小数点型の場合、無限小数による丸め誤差が発生することがあるが、Decimalを使うとその心配はなく正確な数値を得ることができる。

イメージしづらいので計算して確かめよう。10進数の小数部を2進数に変換する方法は、数字を2倍した値が1未満なら0をメモする。1以上なら1をメモして1を引く。これを繰り返して0になった時点で終了。

例えば、10進数の0.1を2進数に変換すると以下の計算になる。
0.1 × 2倍 = 0.2 ⇒ 0
0.2 × 2倍 = 0.4 ⇒ 0
0.4 × 2倍 = 0.8 ⇒ 0
0.8 × 2倍 = 1.6 ⇒ 1
0.6 × 2倍 = 1.2 ⇒ 1
0.2 × 2倍 = 0.4 ⇒ 0
…(無限)

メモした値を並べたものが2進数に変換した値になる。
0.0001100110011001100110011…無限

そして、2進数に変換した値を10進数に戻すと10進数も無限小数になり、ぴったり0.1にはならない。これがDoubleやFloatが正確にならないイメージである。

一方、Decimal型は整数値、符合、小数位置を持って保存されているので正確な値で比較、計算することができる。ただし、DoubleやFloatを使うよりパフォーマンスが劣るので必要なものに絞って利用したほうが良い。

 

Binary Data

NSData型のデータを設定する。画像などのサイズが大きいデータが保存されることが想定される。

この型を選択するとOptionに「Allows External Storage」の設定項目が現れる。チェックを入れれば、データを外部ストレージに保存することを許可することになる。

Binary DataのAttributeの設定

 

Transformable

NSCordingプロトコルを適用しているクラスのインスタンスをNsData型に変換して保存してくれる。独自の変換処理を行いたい場合は、NSValueTransformaerクラスのサブクラスをNameに設定する。

Transformable

 

Advanced(高度な設定)

高度な設定に「index in Spotlight」と「Store in External Record File」があるが、OS X用の設定なので検証対象外とする。