如何使用objectForKey在objective-c中编写有效的布尔条件

如何使用objectForKey在objective-c中编写有效的布尔条件,objective-c,conditional,boolean,Objective C,Conditional,Boolean,我试图理解为什么下面的语句总是会碰到ELSE子句。我搞不懂的是,不管实际值是多少(NSLog显示为0还是1),这总是会命中else。有什么原因吗 NSArray项是从JSON对象中提取的-仅供参考 BOOL* instock = [item objectForKey:@"itemInStock"]; obj.instock = instock; NSLog(@"and it was %@", obj.instock); if (obj.instock == YES) {

我试图理解为什么下面的语句总是会碰到ELSE子句。我搞不懂的是,不管实际值是多少(NSLog显示为0还是1),这总是会命中else。有什么原因吗

NSArray项是从JSON对象中提取的-仅供参考

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
    }

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

BOOL* instock = [item objectForKey:@"itemInStock"];
毫无意义
-objectForKey:
不返回
BOOL*
值。它返回
id
。我在这里猜测,您实际上得到了一个
NSNumber*
,它正好工作正常,因为
NSNumber*
适合
BOOL*
(因为它们都是指针)。类似地,
obj.instock
也可能是一个
NSNumber*
对象(如果它不是某种类型的对象,您的
NSLog()
会崩溃)

因此,假设
obj.instock
是一个
NSNumber*
,那么您想要的条件就是

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

您还应该修复此代码,以避免在您没有的情况下尝试声称您有一个
BOOL*

在您的
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*
)。在这种情况下,您发布的代码将不起作用。@凯文:首先,您如何知道他的
对象。instock
不是
BOOL
?我们都不知道obj.instock是什么数据类型,因为根本没有声明。其次,我的代码意味着
obj.instock
被声明为
BOOL
数据类型。如果
obj.instock
BOOL
,那么原始代码中的
NSLog
就会崩溃。这就是为什么我用“假设他发布的代码没有崩溃”来限定我的声明。