问题
I have a JSON parser in my app, and I load the value into a detailDataSourceDict variable. When I try to get the valueForKey of the array and try to compare it to 0, it never works...
Here's my code:
if (indexPath.row == 1) {
NSNumber *rating = [detailDataSourceDict valueForKey:@"rating"];
NSLog(@"Rating: %@",rating);
if (rating == 0) {
cell.detailTextLabel.text = @"This sheet has not yet been rated.";
}
else {
cell.detailTextLabel.text = [NSString stringWithFormat:@"This sheet has a %@ star rating.",rating];
}
cell.textLabel.text = @"Rating";
}
I see in my JSON feed that "rating":"0", but when the rating is 0, it shows "This sheet has a 0 star rating.", instead of "This sheet has not yet been rated."
Any suggestions? Thanks.
回答1:
NSNumber *rating is an object. 0 is a primitive type.
Primitive types can be compared with ==. Objects cannot; they need to be compared for equality using isEqual:.
Thus replace this:
rating == 0
with:
[rating isEqual:@0]
(@0 being a NSNumber literal)
or alternatively:
rating.integerValue == 0
The reason why your wrong code even compiles is that 0 is equal to 0x0 which in turn is equal to nil (kind of, sparing the details).
So, your current code would be equivalent to this:
rating == nil
回答2:
rating is a pointer to an NSNumber object, if you compare with == 0, you'll be comparing the pointer only.
If you want to compare the value with 0, you'll have to get the actual value using intValue, try;
if ([rating intValue] == 0) {
回答3:
NSNumber is an object and you have to access it's value with the value accessors.
[NSNumber intValue];
See "Accessing Numeric Values" @:
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html
回答4:
You want to change it from:
if (rating == 0) {
To
if ([rating intValue] == 0) {
来源:https://stackoverflow.com/questions/13432042/comparing-nsnumber-to-0-not-working