19

我有一个简单的问题(我认为):我正在尝试将 NSNumber 与 int 进行比较,看看它是 0 还是 1。这是代码:

id i = [dictionary objectForKey:@"error"]; //class = NSCFNumber

NSLog(@"%@ == 0 -> %@", i, i == 0);
NSLog(@"%@ == 0 -> %@", i, [i compare:[NSNumber numberWithBool:NO]]);

我对方法进行了尝试,但结果为 null:

2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null)
2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null)

你能帮助我吗?

4

5 回答 5

49
  1. 比较的结果是一个 BOOL,它不是一个 Objective-C 对象。因此,您不应使用%@. 请尝试%d(显示 0 或 1)。

  2. [a compare:b]如果 ,则返回 -1 ,如果 则返回a < b0,如果 则返回a == b1 a > b。所以你的第二个结果是预期的。

  3. 您不能直接将 NSNumber 与整数进行比较。这i == 0实际上是一个指针比较,它检查是否i为 NULL (0),如果该数字存在,这当然是 FALSE。所以第一个结果也是预期的。

  4. 如果要检查是否相等,请使用[a isEqualToNumber:b]. 或者,您可以提取整数[a intValue]并直接与另一个整数进行比较。

所以以下应该工作:

NSLog(@"%@ == 0 -> %d", i, [i isEqualToNumber:[NSNumber numberWithInt:0]]);
NSLog(@"%@ == 0 -> %d", i, [i intValue] == 0);

如果“数字”实际上是一个布尔值,最好-boolValue取而代之。

NSLog(@"%@ == 0 -> %d", i, ! [i boolValue]);
于 2010-10-17T20:07:44.293 回答
9

在这里,您将对象 i 的指针与 0 进行比较,恐怕这不是您想要的。

您很可能想要比较 i 的值:

if ([i intValue]==0) {
  ...
}
于 2010-10-17T20:09:37.797 回答
4

您可以轻松编写:

NSNumber *number = [NSNumber numberWithInt:123];
int integer = 1234;

NSLog(@"%@ == %i : %i", number, integer, [number intValue] == integer);

输出应该是

123 == 1234 : 0


我希望我能帮助你!

于 2010-10-17T20:13:08.577 回答
3

你有两个问题:

  • 您将 NSNumber 对象与其所代表的值混淆了。
  • 您的NSLog格式字符串与您提供的参数类型不匹配。

关于第一个问题:i是一个地址,可能类似于0x1f84b. 当你测试是否i == 0,你正在测试是否i == NULL。在这种情况下,这意味着您正在测试字典中是否存在键“错误”,因为查找不存在的键会获得NULL.

[i intValue],另一方面,是整数。如果NSNumber包含可表示为整数的值,则这将是 的值NSNumber。这就是您在使用格式说明符打印NSNumber's 描述时看到的内容。%@

关于第二个问题:C 和 Objective-C 中的比较返回一个整数,0(表示假)或 1(表示真)。为了直接打印比较结果,您需要使用整数格式说明符。实际上有两个这样的说明符,%i%d. 您可以将比较结果包装在一个 NSNumber 中并用于%@打印它,但这比它的价值更多。

所以,这就是你应该做的:

NSNumber *i = [dictionary objectForKey:@"error"];
BOOL haveValue = (i != NULL);
if (haveValue) {
    int iValue = [i intValue];
    NSLog(@"%d == 0 -> %d", iValue, iValue == 0);
    NSLog(@"%@ compared to 0 -> %d", i, [i compare:[NSNumber numberWithInt:0]]);
} else {
    NSLog(@"*** Dictionary has no value for key \"error\"!");
}
于 2010-10-17T20:23:06.650 回答
0

这有效

if (thevariable.intValue==0) {
  ...
}
于 2017-03-30T15:15:13.697 回答