Iphone 如何从id获取布尔

Iphone 如何从id获取布尔,iphone,objective-c,cocoa,xcode,Iphone,Objective C,Cocoa,Xcode,我打电话给valueForKey询问一件事。这将返回一个我试图转换为BOOL的id(因为我知道该值是BOOL)。但XCode给出了以下警告: “警告:从指针强制转换为不同大小的整数…” 所以我最后做的是: BOOL value = [[NSNumber numberWithInt:((NSInteger)[managedObject valueForKey:@"fieldName"])] boolValue]; 我想一定有更简单的办法。是否存在?-valueForKey:始终返回一个对象id是

我打电话给valueForKey询问一件事。这将返回一个我试图转换为BOOL的id(因为我知道该值是BOOL)。但XCode给出了以下警告:

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

所以我最后做的是:

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

我想一定有更简单的办法。是否存在?

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

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

po value
po [value class]

您会发现该值实际上是一个NSNumber,因此可以向其发送
-boolValue
消息以获取您感兴趣的BOOL标志。

如果键的值是BOOL,则返回的对象将是一个NSNumber。您只需请求它的
布尔值
。不能简单地从对象(
id
)强制转换为布尔、整数或任何其他非对象类型。KVC机器会自动将标量转换为适当的值类型,因此您可以要求它输入所需的类型。您可能会感兴趣-他们会更详细地解释这一点。

更简单?也许不是。更简洁?不是你问的时候,而是现代(至少从2015年起)Obj-C,是的。如果对象是具有任何类型的字符串或数值(
NSDictionary
)的字典,则可以使用:

//value = (id)
NSNumber *val = value;
BOOL success = [val boolValue];
if (success) {
 //yay!
}
BOOL value = @(managedObject[@"fieldName"]).boolValue;
另外,请注意,如果您知道从
@“fieldName”
获得的值是
NSNumber
,则可以跳过转换:

BOOL value = [managedObject[@"fieldName"] boolValue];

为什么? 由于LLVM编译器中的一些更改:

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

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

Swift 3

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

实际上,结果是在NSNumber类集群中。本例中奇怪的是,它返回一个空的NSNumber,而不是NSCFoolean。