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