Iphone 核心数据和BOOL设置
我正在开发一个应用程序,它使用核心数据作为后端来管理SQLite记录。我用字符串和数字处理一切,但只是尝试添加布尔字段,似乎无法使事情正常进行 在.xcdatamodel中,我向我的对象添加了一个名为Iphone 核心数据和BOOL设置,iphone,core-data,ipad,Iphone,Core Data,Ipad,我正在开发一个应用程序,它使用核心数据作为后端来管理SQLite记录。我用字符串和数字处理一切,但只是尝试添加布尔字段,似乎无法使事情正常进行 在.xcdatamodel中,我向我的对象添加了一个名为isCurrentlyForSale的字段,该字段不是可选的,不是暂时的,也没有索引。属性的类型设置为布尔型,默认值为NO 当我从数据模型创建类文件时,在.h头中为此属性添加的样板代码是: @property (nonatomic, retain) NSNumber * isCurrentlyFor
isCurrentlyForSale
的字段,该字段不是可选的,不是暂时的,也没有索引。属性的类型设置为布尔型,默认值为NO
当我从数据模型创建类文件时,在.h头中为此属性添加的样板代码是:
@property (nonatomic, retain) NSNumber * isCurrentlyForSale;
随着
@dynamic isCurrentlyForSale;
在.m实现文件中
我一直把布尔人当作简单的布尔人。我读到过,我可以使用NSNumber的numberWithBool
和boolValue
方法,但对于如此简单的东西,这似乎是一个非常多的额外代码
标题中的@property是否可以更改为简单BOOL?如果有,有什么需要注意的吗
谢谢
-John简单回答:不,您不能更改
@属性
声明以返回BOOL
不过,您可以编写一些简单的包装。我将属性重命名为currentlyForSale
(这意味着它将生成currentlyForSale
和setCurrentlyForSale:
),然后编写两个包装器:
- (BOOL) isCurrentlyForSale {
return [[self currentlyForSale] boolValue];
}
- (void) setIsCurrentlyForSale:(BOOL)forSale {
[self setCurrentlyForSale:[NSNumber numberWithBool:forSale]];
}
虽然Dave DeLong的答案很接近,但实际上您可以做到这一点,而无需更改属性的名称 您可以更改属性以返回一个
BOOL
,但是您需要手工编写访问器方法,它们与Dave在其响应中的方法有些不同
首先,您的@属性应定义为:
@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale;
然后在实现文件中,直接创建访问器,而不是声明@dynamic
属性
- (BOOL)isCurrentlyForSale
{
[self willAccessValueForKey:@"currentlyForSale"];
BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue];
[self didAccessValueForKey:@"currentlyForSale"];
return b;
}
- (void)setCurrentlyForSale:(BOOL)b
{
[self willChangeValueForKey:@"currentlyForSale"];
[self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"];
[self didChangeValueForKey:@"currentlyForSale"];
}
使用这些访问器,您的对象将为您处理装箱,您可以将其作为基本值进行访问。另外,以setIs
开头的setter不是一个好主意,因此在示例代码中删除它。setter或属性都不应该包含“is”。这就是为什么@property
具有getter=
设置的原因。是的,您可以使用作为核心数据一部分的基本访问器将@属性更改为BOOL。@Marcus是的,我知道setter中不应该有Is
,但我把它放进去了,因为setCurrentlyForSale:
已经被CD占用了(我知道getter=
和setter=
。你是说你可以将标题中的NSNumber*
更改为BOOL
,它会起作用吗?这肯定会让我吃惊。+1啊,我明白你现在说的。我以为你是在暗示你可以将@属性更改为BOOL
,不实现自定义方法。顺便说一句,setter有点不正确。只有在新值实际不同时(即,您需要if语句),才应调用(will | did)ChangeValueForKey:
。我要补充的唯一一点是,我喜欢使用NSString常量作为键名,这样可以避免以后在排除印刷错误时遇到麻烦。NSString*const CurrentlyForSale=@“CurrentlyForSale”;