我正在开发一个使用Core Data作为管理SQLite记录后端的应用程序。我有一切都在处理字符串和数字,但刚刚尝试添加BOOL字段,似乎无法让事情发挥作用。
在.xcdatamodel中,我在我的对象中添加了一个名为isCurrentlyForSale
的字段,该字段不是可选的,不是Transient,也不是Indexed。属性的类型设置为布尔值,默认值为NO。
当我从数据模型创建类文件时,.h标题中为此属性添加的样板代码为:
@property (nonatomic, retain) NSNumber * isCurrentlyForSale;
与
一起@dynamic isCurrentlyForSale;
<。>在.m实现文件中。
我一直使用布尔值作为简单的BOOL。我已经读过,我可以使用NSNumber的numberWithBool
和boolValue
方法,但这似乎是一个非常简单的额外代码。
标题中的@property可以更改为简单的BOOL吗?如果有,有什么值得注意的吗?
由于 -John
答案 0 :(得分:30)
虽然Dave DeLong的回答很接近,但您实际上可以这样做,而无需更改属性的名称。
您可以更改属性以返回BOOL
,但您需要手动编写访问器方法,它们与Dave在响应中的内容略有不同。
首先,您的@property
应定义为:
@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不是一个好主意,因此在示例代码中将其删除。
答案 1 :(得分:2)
简单回复:不,您无法更改@property
声明以返回BOOL
。
但是你可以编写一些简单的包装器。我将属性重命名为currentlyForSale
(这意味着它生成currentlyForSale
和setCurrentlyForSale:
),然后编写两个包装器:
- (BOOL) isCurrentlyForSale {
return [[self currentlyForSale] boolValue];
}
- (void) setIsCurrentlyForSale:(BOOL)forSale {
[self setCurrentlyForSale:[NSNumber numberWithBool:forSale]];
}