如何从id类型获取BOOL

17

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

"warning: cast from pointer to integer of different size..."

所以最终我做的是:

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

我在思考是否有更简单的方法。有吗?

5个回答

31

-valueForKey: 总是返回一个对象。 id 是指向任何对象的指针的objective-c类型。

您可以在调试器中检查该对象。 一些有用的命令:

po value
po [value class]

你会发现这个值实际上是一个NSNumber,因此你可以发送它-boolValue消息来获取你感兴趣的BOOL标志。


27
//value = (id)
NSNumber *val = value;
BOOL success = [val boolValue];
if (success) {
 //yay!
}

9
如果键的值是 BOOL,则返回的对象将是 NSNumber。您可以请求其boolValue。您不能简单地将对象(id)强制转换为 BOOL、整数或任何其他非对象类型。KVC 机制会自动将标量装箱到适当的值类型中,因此您只需请求所需的类型即可。您可能会对KVC 文档感兴趣——它们会更详细地解释这一点。

实际上,结果在NSNumber 类群中。这种情况下有趣的是它返回一个裸的NSNumber,而不是NSCFBoolean。 - quellish

2

更简单了吗?也许不是。更简洁了吗?当你询问时不是,但在现代(至少从2015年开始的)Obj-C中,是的。如果您的对象是一个带有字符串或数字值(NSDictionary<id,StringOrNumber>)的字典,您可以使用:

BOOL value = @(managedObject[@"fieldName"]).boolValue;

请注意,如果您知道从@"fieldName"获取的值是NSNumber,则可以跳过转换:
BOOL value = [managedObject[@"fieldName"] boolValue];

为什么?

由于LLVM编译器的一些变化:

  • NSDictionary现在可以使用熟悉的dictionary[key]语法进行读写
  • 兼容值可以使用@(value)语法转换为NSNumber更多信息
  • 所有属性(以及取零参数并返回值的方法)都可以使用点语法进行访问:object.propertyobject.method

现在有很多不错的语法糖。我建议您了解一下!


0

Swift 3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接