2010-10-17 56 views
15

我有一个简单的问题(我认为): 我想一个比较的NSNumber用INT,看它是否是0或1。以下是代码:一个比较向的NSNumber一个int

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

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

我尝试这样的方法,但我得到空的结果是:

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) 

你能帮助我吗?

回答

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

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

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

  4. 如果你想检查是否相等,use [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]); 
+0

,我应该还记得我不使用%@ :)谢谢;) – patrick 2010-10-17 20:19:23

9

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

你最想比较i的值:

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

你可以随便写:

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

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

输出应该是

123 == 1234 : 0 


我希望我能帮你!

3

你有两个问题:

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

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

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

关于第二个问题:在C和Objective-C中的比较返回一个整数,即0(表示false)或1(意思是true)。为了直接打印比较结果,您需要使用整数格式说明符。实际上有两个这样的说明符,%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\"!"); 
} 
0

这个工作

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