我在一个对象上调用valueForKey。这将返回一个我试图强制转换为BOOL的id(因为我知道该值是BOOL)。但是XCode给出了以下警告:
“警告:从指针转换为不同大小的整数......”
所以我最终做的就是:
BOOL value = [[NSNumber numberWithInt:((NSInteger)[managedObject valueForKey:@"fieldName"])] boolValue];
我认为必须有一种更简单的方法。有吗?
答案 0 :(得分:31)
-valueForKey:始终返回一个对象。 id
是指向任何对象的指针的objective-c类型。
您可以在调试器中检查对象。一些有用的命令:
po value
po [value class]
您会发现该值实际上是一个NSNumber,因此您可以向其发送-boolValue
消息以获取您感兴趣的BOOL标志。
答案 1 :(得分:27)
//value = (id)
NSNumber *val = value;
BOOL success = [val boolValue];
if (success) {
//yay!
}
答案 2 :(得分:9)
如果键的值是BOOL,则返回的对象将是NSNumber。你可以问它boolValue
。您不能简单地从对象(id
)转换为BOOL或整数或任何其他非对象类型。 KVC机器将标量变为适当的值类型,因此您可以询问它所需的类型。您可能对KVC docs感兴趣 - 他们会更详细地解释这一点。
答案 3 :(得分:0)
更容易?也许不是。更简洁?不是在你问的时候,而是在现代(至少从2015年开始)Obj-C,是的。如果您的对象是包含任何类型的字符串或数字值(NSDictionary<id, StringOrNumber>
)的字典,您可以使用:
BOOL value = @(managedObject[@"fieldName"]).boolValue;
另请注意,如果您知道从@"fieldName"
获得的值为NSNumber
,则可以跳过转换:
BOOL value = [managedObject[@"fieldName"] boolValue];
感谢LLVM编译器的一些更改:
NSDictionary
现在可以使用熟悉的dictionary[key]
语法NSNumber
语法将兼容值转换为@(value)
个。 more object.property
和object.method
。现在有很多很好的语法糖。我建议你调查一下!
答案 4 :(得分:0)
Swift 3
if let boolValue = dict["key"] as? Bool {
// do something with boolValue
}