我有一个简单的问题(我认为): 我正在尝试将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)
你能帮助我吗?
答案 0 :(得分:46)
比较结果是BOOL,它不是Objective-C对象。因此,您应该使用%@
不打印它。请改为%d
(显示0或1)。
[a compare:b]
如果a < b
则返回-1,如果a == b
则返回0,如果a > b
则返回1。所以你的第二个结果是预期的。
您无法直接将NSNumber与整数进行比较。 i == 0
实际上是一个指针比较,它检查i
是否为NULL(0),如果该数字存在,当然是FALSE。所以第一个结果也是预期的。
如果要检查是否相等,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]);
答案 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)
你有两个问题:
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) {
...
}