【发布时间】:2011-02-25 15:32:07
【问题描述】:
我已将我的核心数据属性之一设置为布尔值。现在,我需要设置它,但 XCode 一直告诉我它可能无法响应 setUseGPS。
[ride setUseGPS: useGPS.on];
在核心数据中设置布尔值的方法是什么?我所有的其他属性都是这样设置的,而且效果很好。那么,不知道为什么布尔值不能以这种方式设置?
【问题讨论】:
标签: iphone core-data boolean uiswitch
我已将我的核心数据属性之一设置为布尔值。现在,我需要设置它,但 XCode 一直告诉我它可能无法响应 setUseGPS。
[ride setUseGPS: useGPS.on];
在核心数据中设置布尔值的方法是什么?我所有的其他属性都是这样设置的,而且效果很好。那么,不知道为什么布尔值不能以这种方式设置?
【问题讨论】:
标签: iphone core-data boolean uiswitch
Core Data“没有”布尔类型(有,但它是一个 NSNumber)。
所以设置相当于useGPS = YES。
[entity setUseGPS:[NSNumber numberWithBool:YES]];
反之亦然:
BOOL isGPSOn = [[entity useGPS] boolValue];
更新: 正如 SKG 所指出的,使用 Objetive-C 中的文字,您现在可以以更简单的方式完成:
[entity setUseGPS:@YES];
BOOL isGPSOn = entity.useGPS.boolValue;
【讨论】:
object.isGPSOn = @YES;
作为接受答案的替代方法,您可以简单地将托管对象接口定义中的类型从 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(非原子,getter=isDone) BOOL 完成;
然后你可以写“if (item.done) { ... }" 或 "item.done = NO;" 和 编译器仍会生成 -isDone 用于访问该属性。
感谢克里斯,希望这对某人有所帮助。
【讨论】:
为了补充 @RickiG 的答案,在 Swift 中从 Bool 和反之亦然创建 NSNumber 的方法是:
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"];
}
【讨论】: