2010-05-17 86 views
9

我正在使用核心数据作为其后端管理SQLite记录的应用程序。我有一切工作与字符串和数字,但只是尝试添加BOOL字段,似乎无法让事情工作。核心数据和布尔设置

在.xcdatamodel中,我在我的对象中添加了一个名为isCurrentlyForSale的字段,该字段不是可选的,不是可变的,也不是索引的。属性的类型设置为布尔值,默认值为NO。

当我从数据模型创建的类文件,添加了该属性在.H头中的样板代码是:

@property (nonatomic, retain) NSNumber * isCurrentlyForSale; 

@dynamic isCurrentlyForSale; 

沿.M实施文件。

我一直使用布尔作为简单布尔。我读过我可以使用NSNumber的numberWithBoolboolValue方法,但是这对于如此简单的事情来说似乎是一大堆额外的代码。

标题中的@property可以更改为简单的BOOL吗?如果有,还有什么需要注意的?

感谢 -John

回答

2

简单回应:不,你不能改变@property声明返回一个BOOL

虽然你可以写一些简单的包装。我会重新命名属性currentlyForSale(这意味着它产生currentlyForSalesetCurrentlyForSale:),然后写两个包装:

- (BOOL) isCurrentlyForSale { 
    return [[self currentlyForSale] boolValue]; 
} 

- (void) setIsCurrentlyForSale:(BOOL)forSale { 
    [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]]; 
} 
+0

二传手也不应该有一个“是”在其中。这就是为什么'@ property'具有'getter ='设置的原因。是的,您可以通过使用属于Core Data的原始访问器将“@属性”更改为BOOL。 – 2010-05-18 15:55:56

+0

@Marcus是的,我知道setters不应该在它们中包含'Is',但是我已经把它放入了,因为'setCurrentlyForSale:'已经被CD使用了(我知道'getter ='和'setter ='。你是说你可以在标题中将'NSNumber *'更改为'BOOL',它会起作用吗?那肯定会让我感到惊讶。 – 2010-05-18 16:09:14

30

尽管戴夫德隆的答案是接近的,你其实可以做到这一点,而不必更改名称财产。

可以更改属性返回BOOL但您需要手动编写存取方法,他们有点不同于戴夫在他的回应。

首先你@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不是一个好主意,因此在示例代码中将其删除。

+0

+1啊,我现在明白你的意思了。我以为你暗示你可以将'@ property'改为'BOOL',而不是实现自定义方法。顺便说一下,制定者稍微不正确。只有当新值实际上不同时(即,你需要一个if语句),才会调用'(will | did)ChangeValueForKey:'。 – 2010-05-18 16:51:16

+0

优秀的例子和解释 - 谢谢Marcus! – 2012-04-12 19:55:52

+0

我唯一要补充的是,我喜欢使用NSString常量作为关键字名称,它可以节省以后排除打印错误的麻烦。 'NSString * const CurrentlyForSale = @“currentlyForSale”;' – Eric 2012-09-20 22:20:10