将NSNumber与int进行比较

时间:2010-10-17 20:03:09

标签: objective-c compare nsnumber

我有一个简单的问题(我认为): 我正在尝试将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)

你能帮助我吗?

5 个答案:

答案 0 :(得分:46)

  1. 比较结果是BOOL,它不是Objective-C对象。因此,您应该使用%@ 打印它。请改为%d(显示0或1)。

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

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

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

  5. 所以以下内容应该有效:

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

    如果“数字”实际上是一个布尔值,最好采用-boolValue代替。

    NSLog(@"%@ == 0 -> %d", i, ! [i boolValue]);
    

答案 1 :(得分:9)

这里你将对象i的指针与0进行比较,我担心这不是你想要的。

您最有可能想要比较i的值:

if ([i intValue]==0) {
  ...
}

答案 2 :(得分:3)

您可以轻松地写下:

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

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

输出应为

123 == 1234 : 0


我希望我能帮到你!

答案 3 :(得分:3)

你有两个问题:

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

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

另一方面,

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

关于第二个问题: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\"!");
}

答案 4 :(得分:0)

这有效

if (thevariable.intValue==0) {
  ...
}