53

我已将我的核心数据属性之一设置为布尔值。现在,我需要设置它,但 XCode 一直告诉我它可能无法响应 setUseGPS。

[ride setUseGPS: useGPS.on];

在核心数据中设置布尔值的方法是什么?我所有的其他属性都是这样设置的,而且效果很好。所以,不知道为什么布尔值不能以这种方式设置?

4

4 回答 4

134

核心数据“没有”布尔类型(它有,但它是一个 NSNumber)。

所以设置相当于useGPS = YES。

[entity setUseGPS:[NSNumber numberWithBool:YES]];

反之亦然:

BOOL isGPSOn = [[entity useGPS] boolValue];

更新: 正如 SKG 所指出的,使用 Objetive-C 中的文字,您现在可以以更简单的方式进行操作:

[entity setUseGPS:@YES];

BOOL isGPSOn = entity.useGPS.boolValue;
于 2010-05-30T11:11:11.273 回答
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

这里讨论了各种替代方法,但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。

谢谢克里斯,希望这对某人有所帮助。

于 2011-04-01T09:20:39.100 回答
2

只是为了补充@RickiG 的答案,在 Swift 中(至少从 v4.2 开始)NSNumber从 a创建Bool和反之亦然的方法是:

let nsNumberFromBool = NSNumber(booleanLiteral: true) // or false
let boolFromNSNumber = nsNumberFromBool.boolValue
于 2018-10-04T12:30:40.300 回答
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"];
}
于 2010-06-16T08:16:11.880 回答