我正在开发一个使用 Core Data 作为后端来管理 SQLite 记录的应用程序。我可以使用字符串和数字进行所有操作,但刚刚尝试添加 BOOL 字段,但似乎无法正常工作。
在 .xcdatamodel 中,我向对象添加了一个名为 isCurrentlyForSale
的字段,该字段不是可选的,不是 transient 的,也不是索引的。该属性的类型设置为 Boolean,默认值为 NO。
当我从数据模型创建类文件时,在 .h header 中为此属性添加的样板代码是:
@property (nonatomic, retain) NSNumber * isCurrentlyForSale;
随着
@dynamic isCurrentlyForSale;
在.m实现文件中。
我一直将 bool 值作为简单的 BOOL 来使用。我读过,我可以使用 NSNumber 的 numberWithBool
和 boolValue
方法,但这对于如此简单的事情来说似乎需要大量额外代码。
标题中的@property可以改成简单的BOOL吗?如果是的话有什么需要注意的吗?
谢谢 -约翰
最佳答案
虽然 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 并不是一个好主意,因此在示例代码中将其删除。
关于iphone - 核心数据和 BOOL 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850532/