【问题标题】:How to get BOOL from id如何从 id 获取 BOOL
【发布时间】:2010-11-16 21:00:12
【问题描述】:

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

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

所以我最终做的是:

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

我在想一定有一个更简单的方法。有吗?

【问题讨论】:

    标签: iphone objective-c cocoa xcode


    【解决方案1】:

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

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

    po value
    po [value class]
    

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

    【讨论】:

      【解决方案2】:
      //value = (id)
      NSNumber *val = value;
      BOOL success = [val boolValue];
      if (success) {
       //yay!
      }
      

      【讨论】:

        【解决方案3】:

        如果键的值为 BOOL,则返回的对象将是 NSNumber。你可以问它boolValue。您不能简单地将对象 (id) 转换为 BOOL 或整数或任何其他非对象类型。 KVC 机器将标量自动装箱为适当的值类型,因此您只需向它询问您想要的类型。您可能对KVC docs 感兴趣——他们对此进行了更详细的解释。

        【讨论】:

        • 其实结果是在NSNumber的class簇中。在这种情况下,奇怪的是它返回一个裸露的 NSNumber,而不是一个 NSCFBoolean。
        【解决方案4】:

        更容易?也许不是。更简洁?不是当你问的时候,而是在现代(至少从 2015 年开始)Obj-C 中,是的。如果您的对象是具有任何类型的字符串或数字值 (NSDictionary<id, StringOrNumber>) 的字典,您可以使用:

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

        另外请注意,如果您知道从 @"fieldName" 获得的值是 NSNumber,则可以跳过转换:

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

        为什么?

        感谢 LLVM 编译器的一些变化:

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

        现在有很多不错的语法糖。我建议你研究一下!

        【讨论】:

          【解决方案5】:

          斯威夫特 3

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

          【讨论】:

            猜你喜欢
            • 2022-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-27
            • 2018-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多