1789040
1789040

Reputation: 579

Comparing NSNumber to 0 not working?

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.

Upvotes: 24

Views: 16166

Answers (4)

Regexident
Regexident

Reputation: 29552

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

Upvotes: 62

sampson-chen
sampson-chen

Reputation: 47267

You want to change it from:

if (rating == 0) {

To

if ([rating intValue] == 0) {

Upvotes: 3

bryanmac
bryanmac

Reputation: 39296

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

Upvotes: 4

Joachim Isaksson
Joachim Isaksson

Reputation: 180897

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) {

Upvotes: 4

Related Questions