2011-08-12 100 views

回答

3

核心数据将只允许NSNumbers。但是,您可以编写自定义getter和setter来使用NSInteger属性。 mogenerator是一个很棒的工具,可以自动为您执行:它为您的所有实体生成具有本机属性的类。

+5

同样在Xcode的当前版本(4.3.2和此评论中)中,您可以在生成NSManagedObject子类时选中“为基元数据类型使用标量属性” - 这将导致编译器“只知道”使合成访问者提升/降级NSNumber和适当的标量。例如,“Integer 32”将在您生成的.h文件中声明为int32_t,您可以将整数简单地分配给代码中的属性。 –

2

编号NSInteger只是一个长整型的typedef,而不是一个对象。

实际实现:

#if __LP64__ || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 

NSNumber类允许原始类型(intfloat等)转换成一个对象,然后可将其存储到属性列表和核心数据的封装。

实施例:

float pi = 3.1415; 
NSNumber *piNumber = [NSNumber numberWithFloat:pi]; 

然后,可以方便地访问和/或转换存储在NSNumber对象的值:

int piAsInteger = [piNumber intValue]; 
+0

一个合理的答案 - 但不适用于这个特定的问题。 – Abizern

+0

是的。核心数据只包含*对象*,这就是为什么'NSNumber'类是必需的。如果没有不可靠的第三方实用程序,没有其他选择可以与任何更新打破。 –

+1

他问他是否可以跳过NSNumber并使用NSInteger。答案是否定的,因为您只能将对象存储在核心数据中。关于NSNumber如何封装值的描述是多余的。如果有人不同意我的观点,他们可以自由地提出你的答案。 – Abizern