我已将我的一个核心数据属性设置为布尔值。现在,我需要设置它,但XCode一直告诉我它可能不响应setUseGPS。
[ride setUseGPS: useGPS.on];
在核心数据中设置布尔值的方法是什么?我所有其他属性都以这种方式设置,并且它们运行良好。那么,不确定为什么布尔值无法以这种方式设置?
答案 0 :(得分:133)
核心数据“没有”布尔类型(确实如此,但它是一个NSNumber)。
所以设置useGPS = YES的等价物。
[entity setUseGPS:[NSNumber numberWithBool:YES]];
反过来说:
BOOL isGPSOn = [[entity useGPS] boolValue];
<强>更新强> 正如SKG所指出的,使用Objetive-C中的文字,你现在可以用更简单的方式来实现:
[entity setUseGPS:@YES];
BOOL isGPSOn = entity.useGPS.boolValue;
答案 1 :(得分:18)
作为接受答案的替代方法,您只需在管理对象接口定义中将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
讨论了各种替代方法here,但Chris Hanson的反应对我来说最为启发,尤其是:
如果您有数字属性 (包括布尔属性)即 必需的,你可以输入它作为 相反,标量和Core Data会做 正确的事:
@property(nonatomic)BOOL isDone;
即使该属性是可选的, 这仍然有用 - 它只是 将“不存在”与“虚假”混为一谈。
以及更加一致的Cocoa实现:
您可能想要做的另一件事 名称属性“完成”,只是 将getter指定为“isDone”。那是 通常的Cocoa命名约定:
@property(nonatomic,getter = isDone) BOOL完成了;
然后你可以写“if(item.done){ ...}“或”item.done = NO;“和 编译器仍会生成-isDone 访问该物业。
感谢克里斯,并希望这有助于某人。
答案 2 :(得分:2)
仅是对@RickiG答案的补充,从NSNumber
创建Bool
的方法(反之亦然)(至少从v4.2起)是:
let nsNumberFromBool = NSNumber(booleanLiteral: true) // or false
let boolFromNSNumber = nsNumberFromBool.boolValue
答案 3 :(得分:0)
对此的“修复”(恕我直言,这是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"];
}