【问题标题】:How to write a valid boolean conditional in objective-c using objectForKey如何使用objectForKey在objective-c中编写有效的布尔条件
【发布时间】:2011-01-05 01:01:54
【问题描述】:

我正在寻求了解为什么以下内容总是会遇到 ELSE 子句。我无法弄清楚的是,无论实际值如何( NSLog 显示 0 或 1),它总是会命中其他值。有什么原因吗?

项 NSArray 是从 JSON 对象中提取的 -fyi

BOOL* instock = [item objectForKey:@"itemInStock"];
    obj.instock = instock;
    NSLog(@"and it was %@", obj.instock);
    if (obj.instock == YES) {
      //do yes stuff
    }else {
      //do no stuff
    }

【问题讨论】:

    标签: objective-c conditional boolean


    【解决方案1】:

    你这里的代码很奇怪。 obj.instock 的类型是什么?你的第一行

    BOOL* instock = [item objectForKey:@"itemInStock"];
    

    完全没有意义。 -objectForKey: 不返回 BOOL* 值。它返回id。我在这里猜测你实际上得到了一个NSNumber *,它恰好可以正常工作,因为NSNumber * 适合BOOL *(因为它们都是指针)。同样,obj.instock 也可能是 NSNumber*(如果它不是某种对象,您的 NSLog() 会崩溃)。

    所以,假设obj.instockNSNumber*,你想要的条件很简单

    if ([obj.instock boolValue]) {
        // yes
    } else {
        // no
    }
    

    您还应该修复此代码,以免在您没有 BOOL* 时声称您拥有。

    【讨论】:

      【解决方案2】:

      在您的NSLog 中,您使用的是%@
      %@ 指的是对象。与您的 BOOL* instock 相反,它不是一个对象。

      有办法解决这个问题。
      您的[item objectForKey:@"itemInStock"]; 返回什么数据类型?
      例如,如果它返回一个 NSNumber,那么你可以这样做:

      obj.instock = [[item objectForKey:@"itemInStock"] boolValue];
      NSLog(@"and it was %d", obj.instock);
      if (obj.instock == YES) {
        //do yes stuff
      }else {
        //do no stuff
      }
      

      同样,还有其他方法可以做到这一点。

      【讨论】:

      • 假设他发布的代码没有崩溃,obj.instock 不是BOOL,而是id(可能是NSNumber*)。在这种情况下,您发布的代码将不起作用。
      • @Kevin:首先,你怎么知道他的obj.instock 不是BOOL?我们所有人都不知道obj.instock 是什么数据类型,因为根本没有声明。其次,我的代码暗示 obj.instock 被声明为 BOOL 数据类型。
      • 如果obj.instockBOOL,那么原始代码中的NSLog 就会崩溃。这就是为什么我用“假设他发布的代码不会崩溃”来限定我的陈述。
      猜你喜欢
      • 2011-09-09
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多