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

发布于 2024-10-10 02:01:22 字数 360 浏览 0 评论 0原文

我试图理解为什么以下内容总是命中 ELSE 子句。我无法弄清楚的是,无论实际值如何( NSLog 显示 0 或 1),它总是会命中 else 。有什么理由吗?

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
    }

I'm seeking to understand why the following always hits the ELSE clause. What I can't figure out is that regardless of the actual value ( NSLog shows a 0 or 1) this always hits the else. Any reason why?

The item NSArray is pulled from a JSON object -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
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

可遇━不可求 2024-10-17 02:01:22

你这里的代码很奇怪。 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 * 当你不这样做时。

Your code here is rather strange. What is the type of obj.instock? Your very first line

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

makes no sense at all. -objectForKey: doesn't return BOOL* values. It returns id. I'm guessing here that you're actually getting an NSNumber * back, and it just happens to work alright because an NSNumber * fits inside of a BOOL * (as they are both pointers). Similarly, obj.instock is likely to be an NSNumber* as well (if it wasn't an object of some sort, your NSLog() would crash).

So, assuming that obj.instock is an NSNumber*, the conditional you want is simply

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

You should also fix this code to not try and claim you have a BOOL* when you don't.

酒浓于脸红 2024-10-17 02:01:22

在您的 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
}

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

In your NSLog, you are using %@.
%@ refers to objects. Contrary to your BOOL* instock which is not an object.

There are ways to fix that.
What data type does your [item objectForKey:@"itemInStock"]; return?
If it returns an NSNumber for example, then you can do:

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

Again, there are other ways to do that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文