Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
25
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@gonsee

Core Dataでスカラー値をプリミティブ型のプロパティで扱う方法

NSManagedObjectのサブクラスを作るとき、XcodeでジェネレートするとデフォルトではIntegerやBooleanの属性がNSNumberのプロパティになります。

@property (nonatomic, retain) NSNumber *number;  // Integer 32
@property (nonatomic, retain) NSNumber *yesOrNo; // Boolean

これはコレクションに値をそのまま放り込めるメリットはありますが、値を使いたいときにいちいちintegerValueboolValueを呼ぶ必要がありますし、セットするときは@()でくくる必要があって何かと面倒です。

特に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;としておくだけで大丈夫です。

参考リンク

25
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
25
Help us understand the problem. What is going on with this article?