NSManagedObject
のサブクラスを作るとき、XcodeでジェネレートするとデフォルトではIntegerやBooleanの属性がNSNumber
のプロパティになります。
@property (nonatomic, retain) NSNumber *number; // Integer 32
@property (nonatomic, retain) NSNumber *yesOrNo; // Boolean
これはコレクションに値をそのまま放り込めるメリットはありますが、値を使いたいときにいちいちintegerValue
やboolValue
を呼ぶ必要がありますし、セットするときは@()
でくくる必要があって何かと面倒です。
特にBooleanの場合、
if (obj.yesOrNo) ...
とやってしまいがちで大変危険です。(この場合値が@(NO)
でもif文判定は真になる)
このようなときはプリミティブ型のプロパティを利用する事ができます。やり方はプロパティの宣言を書き換えるだけです。
@property (nonatomic) int32_t number;
@property (nonatomic) BOOL yesOrNo;
Xcodeでジェネレートするときはファイル保存時のダイアログで「Use scalar properties for primitive data types」にチェックを入れれば上記のようなコードが生成されます。
Appleのドキュメントにはプリミティブ型を使いたい場合はアクセサメソッドを自分で実装する必要があると書かれていますが、iOS 5からは自動生成されるようです。したがって実装部は@dynamic number, yesOrNo;
としておくだけで大丈夫です。