核心数据和BOOL设置

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 numberWithBoolboolValue方法,但这似乎是一些非常简单的额外代码.

标题中的@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不是一个好主意,因此在示例代码中删除它.


Dav*_*ong 2

简单回答:不,您不能更改@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)