我已将我的核心数据属性之一设置为布尔值。现在,我需要设置它,但 XCode 一直告诉我它可能无法响应 setUseGPS。
[ride setUseGPS: useGPS.on];
在核心数据中设置布尔值的方法是什么?我所有的其他属性都是这样设置的,而且效果很好。所以,不知道为什么布尔值不能以这种方式设置?
核心数据“没有”布尔类型(它有,但它是一个 NSNumber)。
所以设置相当于useGPS = YES。
[entity setUseGPS:[NSNumber numberWithBool:YES]];
反之亦然:
BOOL isGPSOn = [[entity useGPS] boolValue];
更新: 正如 SKG 所指出的,使用 Objetive-C 中的文字,您现在可以以更简单的方式进行操作:
[entity setUseGPS:@YES];
BOOL isGPSOn = entity.useGPS.boolValue;
作为接受答案的替代方法,您可以简单地将托管对象接口定义中的类型从 NSNumber* 更改为 BOOL,例如:
@property (nonatomic) BOOL useGPS; // Notice that the 'retain' is also removed as we're now dealing with a scalar rather than an NSObject
这里讨论了各种替代方法,但Chris Hanson的回答对我来说最有启发性,尤其是:
如果你有一个需要的数字属性(包括一个布尔属性),你可以把它输入为一个标量,Core Data 会做正确的事情:
@property (nonatomic) BOOL isDone;
即使该属性是可选的,它仍然可以工作 - 它只会将“不存在”与“假”混为一谈。
对于更一致的 Cocoa 实现:
您可能想做的另一件事是将属性命名为“done”,并将 getter 指定为“isDone”。这是通常的 Cocoa 命名约定:
@property (nonatomic, getter=isDone) BOOL 完成;
然后你可以写“if (item.done) { ... }”或“item.done = NO;” 并且编译器仍会为访问该属性生成 -isDone。
谢谢克里斯,希望这对某人有所帮助。
只是为了补充@RickiG 的答案,在 Swift 中(至少从 v4.2 开始)NSNumber
从 a创建Bool
和反之亦然的方法是:
let nsNumberFromBool = NSNumber(booleanLiteral: true) // or false
let boolFromNSNumber = nsNumberFromBool.boolValue
对此的“修复”(恕我直言,这是 Apple SDK 中的一个错误)是将以下代码添加到您的 CoreData 生成的类中。注意:如果您在一个类别中执行此操作,在一个单独的文件中,那么您不必每次在 Xcode 中重新生成 CoreData 类时重新复制/粘贴它
- (BOOL)useGPS
{
[self willAccessValueForKey:@"useGPS"];
BOOL myuseGPS = [[self primitiveUseGPS] boolValue];
[self didAccessValueForKey:@"useGPS"];
return myuseGPS;
}
- (void)setUseGPS:(BOOL)newValue
{
[self willChangeValueForKey:@"useGPS"];
[self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]];
[self didChangeValueForKey:@"useGPS"];
}