我将我的一个核心数据属性设置为布尔类型。现在,我需要设置它,但 XCode 告诉我可能无法响应 setUseGPS 方法。
[ride setUseGPS: useGPS.on];
在Core Data中设置布尔值的方法是什么?我所有的其他属性都是这样设置的,它们运行得非常好。所以,不确定为什么不能像这样设置布尔值。
Core Data没有布尔类型(实际上它有,但是它是NSNumber类型)。
因此,要设置相当于useGPS = YES的值。
[entity setUseGPS:[NSNumber numberWithBool:YES]];
另一种方法是:
BOOL isGPSOn = [[entity useGPS] boolValue];
更新: 正如SKG所指出的,使用Objective-C中的字面量(literals)你现在可以以一种更简单的方式来实现它:
[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;
即使该属性是可选的,它仍然有效-它将“不出现”与“false”混合在一起。
对于更加符合Cocoa的实现方法:
另外一个您可能想做的事情是将属性命名为“done”,并将getter指定为“isDone”。这是通常的Cocoa命名约定:
@property (nonatomic, getter=isDone) BOOL done;
然后您可以编写“if(item.done){...}”或“item.done = NO;”,编译器仍将生成属性访问的-isDone。
感谢Chris,希望这可以帮助某人。
补充一下@RickiG的回答,使用Swift(至少从v4.2开始),创建NSNumber
对象和布尔值之间的转换方式如下:
let nsNumberFromBool = NSNumber(booleanLiteral: true) // or false
let boolFromNSNumber = nsNumberFromBool.boolValue
对于这个问题的“修复”(在我看来,这是苹果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"];
}
object.isGPSOn = @YES;
- abc123