次のようなプロパティを持つモデルがあります。
たとえば、その値を設定すると:
model.isResolved = @YES;
モデル内に保持されている NSNumber は、それがブール値であることを「忘れます」:
NSLog(@"%@", strcmp([self.isResolved objCType], @encode(BOOL)) == 0 ? @"equal" : @"different");
「違う」と出力します。どうしたの?
次のようなプロパティを持つモデルがあります。
たとえば、その値を設定すると:
model.isResolved = @YES;
モデル内に保持されている NSNumber は、それがブール値であることを「忘れます」:
NSLog(@"%@", strcmp([self.isResolved objCType], @encode(BOOL)) == 0 ? @"equal" : @"different");
「違う」と出力します。どうしたの?
NSNumberとして保存されます-ちなみに@YESはNSNumberを次のように作成しています
[NSNumber numberWithBool:YES]
したがって、boolを元に戻すには、次のようにします。
[isResolved boolValue]
(モデルを作成するときに[スカラープロパティを使用]にチェックマークを付けることで、これを回避できます)
Core Data は、管理対象オブジェクト クラスのすべての属性 (および関係) のゲッター メソッドとセッター メソッドを動的に生成します。これらのアクセサー メソッドは、インスタンス変数によってバックアップされる「通常の」 @syntheized アクセサー メソッドとは異なります。
特に、属性を設定してから再度属性値を取得すると、「元の」オブジェクトとは異なるオブジェクトを取得できます。次のテストは、これfoo1
がブール属性「show」を持つ Core Data エンティティのインスタンスであることを示しています。
NSNumber *yes = @YES;
NSLog(@"yes = %p, type = %s", yes, [yes objCType]);
foo1.show = yes;
NSNumber *val = foo1.show;
NSLog(@"val = %p, type = %s", val, [val objCType]);
出力:
yes = 0x16e595c, type = c
val = 0x744c150, type = i
したがって、属性をc = charでエンコードされた数値に設定しても、getter メソッドはi = intでエンコードされた数値を返します。
このテストは iOS シミュレーターで行われました。興味深いことに、OS X 64 ビットで実行されている同じテストは、c = charでエンコードされた数値を返します。
したがって、Core Data オブジェクトのブールおよびその他のスカラー属性の実際のエンコードは、おそらく Core Data の実装の詳細として扱われるべきです。
モデルで定義されている Core Data タイプを確認する必要がある場合は、代わりに objects エンティティの説明を使用できますobjCType
。
NSEntityDescription *entity = [foo1 entity];
NSAttributeDescription *attr = [[entity attributesByName] objectForKey:@"show"];
NSAttributeType type = [attr attributeType];
if (type == NSBooleanAttributeType) {
NSLog(@"Its a Boolean!");
}