如何从id获取BOOL

时间:2009-08-05 01:25:12

标签: iphone objective-c cocoa xcode

我在一个对象上调用valueForKey。这将返回一个我试图强制转换为BOOL的id(因为我知道该值是BOOL)。但是XCode给出了以下警告:

  

“警告:从指针转换为不同大小的整数......”

所以我最终做的就是:

BOOL value = [[NSNumber numberWithInt:((NSInteger)[managedObject valueForKey:@"fieldName"])] boolValue];

我认为必须有一种更简单的方法。有吗?

5 个答案:

答案 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.propertyobject.method

现在有很多很好的语法糖。我建议你调查一下!

答案 4 :(得分:0)

Swift 3

if let boolValue = dict["key"] as? Bool {
    // do something with boolValue
}