Ios CoreData将NSNumbers转换为BOOL

Ios CoreData将NSNumbers转换为BOOL,ios,core-data,Ios,Core Data,我的CoreData模型中有一个实体,它有一个布尔字段。它作为NSNumber存储在CoreData实体上。我希望访问者使用BOOL而不是NSNumber,这样我就可以使用 comment.isActive = YES; 而不是: BOOL isCommentActive = [NSNumber numberWithBool:comment.isActive]; 我本来打算更改自动生成的实体类文件中的代码,但有人告诉我不要这样做,因为每次提取模型时都会被覆盖 我有一个实体的类别,我尝试编写一

我的CoreData模型中有一个实体,它有一个布尔字段。它作为
NSNumber
存储在CoreData实体上。我希望访问者使用
BOOL
而不是
NSNumber
,这样我就可以使用

comment.isActive = YES;
而不是:

BOOL isCommentActive = [NSNumber numberWithBool:comment.isActive];
我本来打算更改自动生成的实体类文件中的代码,但有人告诉我不要这样做,因为每次提取模型时都会被覆盖

我有一个实体的类别,我尝试编写一个访问器,将其转换为同名的
BOOL
,但这只会导致我陷入循环

有些人提到了方法twizzling,但对我来说,它听起来相当粗糙。我应该创建一个访问器,返回一个不同名称的原语吗

创建时,只需选择“对基本数据类型使用标量属性”选项 Xcode中的托管对象子类。这将创建属性

@interface MyEntity : NSManagedObject
@property (nonatomic) BOOL active;
@end
所有的转换都是在引擎盖下自动完成的。事实上更 高效,因为没有创建
NSNumber
对象

不幸的是,“核心数据编程指南”已经过时 对此,:

可以将属性声明为标量值,但不能声明为标量值 核心数据无法动态生成您必须使用的访问器方法 提供您自己的实现


我所知道的唯一苹果“文档”是WWDC 2011会话视频,比较。

我同意Martin的观点,但您可以尝试在现有的NSManagedObject子类中添加此函数:

 -(void)setActiveRaw:(BOOL)active
 {
     [self setActive:[NSNumber numberWithBool:active]];
 }
然后像这样使用它:

 [comment setActiveRaw:YES];
而不是

 comment.active = [NSNumber numberWithBool:comment.isActive];
您也可以为此编写一个getter:

 -(BOOL)getActiveRaw
 { 
    return [self.active boolValue]
 }

马丁竞选总统!非常感谢。我向AppleSo发送了错误报告,使用原始数据类型意味着我必须使用NSTimeInterval而不是NSDate。有趣。如果我想继续使用NSDate,是否需要编写其他访问器(如getDate和setDate)?@theducs:这可能是最干净的方法。@theducs:实际上,您可以在头文件中将属性的类型更改为NSDate*,并在.m文件中将其保留为动态。唯一的缺点是,当您再次生成文件时,Xcode将覆盖此内容。非常感谢。当我想要得到值时,这并没有多大帮助,但您的设置是正确的。谢谢。没问题,让我为你设置getter函数。好的,但这是重命名属性,我不想这么做。无论如何,谢谢。这并不完全是重命名,我们只是编写了一个自定义的getter和setter,通过谈论我们知道的值(BOOL类型)来处理核心数据值(NSNumber类型)。我百分之百确定我没有重命名属性,我使用它在核心数据中存储typeDef类型属性。对不起,我的意思是我想要的是一对与CoreData实体上的属性同名的访问器。马丁的回答对我很有用。谢谢现在我相信你可以使用
comment.isActive=@YES