I've a simple question (I think): I'm trying to compare a NSNumber with a int, to see if it is 0 or 1. Here is the code:
id i = [dictionary objectForKey:@"error"]; //class = NSCFNumber
NSLog(@"%@ == 0 -> %@", i, i == 0);
NSLog(@"%@ == 0 -> %@", i, [i compare:[NSNumber numberWithBool:NO]]);
I tried this to methods but I get null as result:
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)
Can you help me?
The result of comparison is a BOOL which is not an Objective-C object. Therefore you should not print it using
%@. Try%dinstead (shows 0 or 1).[a compare:b]returns -1 ifa < b, 0 ifa == band 1 ifa > b. So your 2nd result is expected.You cannot compare an NSNumber directly with an integer. That
i == 0is actually a pointer comparison which checks whetheriis NULL (0), which of course is FALSE if that number exists. So the 1st result is also expected.If you want to check for equality, use
[a isEqualToNumber:b]. Alternatively, you could extract the integer out with[a intValue]and compare with another integer directly.
So the followings should work:
NSLog(@"%@ == 0 -> %d", i, [i isEqualToNumber:[NSNumber numberWithInt:0]]);
NSLog(@"%@ == 0 -> %d", i, [i intValue] == 0);
If the "number" is in fact a boolean, it's better to take the -boolValue instead.
NSLog(@"%@ == 0 -> %d", i, ! [i boolValue]);
Here you're comparing the pointer of the object i with 0, which I'm afraid is not what you want.
You most probably want to compare the value of i:
if ([i intValue]==0) {
...
}
You can easily write:
NSNumber *number = [NSNumber numberWithInt:123];
int integer = 1234;
NSLog(@"%@ == %i : %i", number, integer, [number intValue] == integer);
Output should be
123 == 1234 : 0
I hope i can help you!
You have two problems:
- You are confusing the NSNumber object with the value it represents.
- Your
NSLogformat string does not match the types of the arguments that you provide.
Regarding the first problem: i is an address, perhaps something like 0x1f84b. When you test whether i == 0, you are testing whether i == NULL. In this case, that means you are testing whether the key "error" was present in the dictionary or not, since looking up a non-existent key garners a NULL.
[i intValue], on the other hand, is an integer. If the NSNumber contains a value representable as an integer, this will be the value of the NSNumber. That is what you see when you print the NSNumber's description using the %@ format specifier.
Regarding the second problem: Comparisons in C and Objective-C return an integer, either 0 (meaning false) or 1 (meaning true). In order to directly print the result of a comparison, you thus need to use the integer format specifier. There are actually two such specifiers, %i and %d. You could wrap the result of the comparison in an NSNumber and use %@ to print that, but that's more work than it's worth.
So, here's what you should be doing:
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\"!");
}
This worked
if (thevariable.intValue==0) {
...
}
来源:https://stackoverflow.com/questions/3955038/compare-a-nsnumber-to-an-int