2012-11-17 3 views
19

Ich habe einen JSON-Parser in meiner App, und ich lade den Wert in eine detailDataSourceDict-Variable. Wenn ich versuche, die ValueForKey des Arrays zu erhalten und versuchen, es auf 0 zu vergleichen, es funktioniert nie ...Vergleichen von NSNumber mit 0 funktioniert nicht?

Hier ist mein 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"; 


} 

ich in meinem JSON-Feed zu sehen, dass „Bewertung“: "0", aber wenn die Bewertung 0 ist, wird "Dieses Blatt hat 0 Sterne" angezeigt, anstatt "Dieses Blatt wurde noch nicht bewertet".

Irgendwelche Vorschläge? Vielen Dank.

+1

NSNumber Objekt = nicht ein int! rating.intValue –

Antwort

48

NSNumber *rating ist ein Objekt. 0 ist ein primitiver Typ. Primitive Typen können mit == verglichen werden. Objekte können nicht; Sie müssen für die Gleichheit mit isEqual: verglichen werden.

So ist diese ersetzen:

rating == 0 

mit:

[rating isEqual:@0] 

(@0 ist, um eine NSNumber literal)

oder alternativ:

rating.integerValue == 0 

Der Grund, warum Ihr falscher Code kompiliert auch das ist 0-0x0 gleich ist, der wiederum gleich nil (eine Art, die Details zu schonen). So würde Ihr aktueller Code dies äquivalent sein:

rating == nil 
+0

Vielen Dank für Ihre schnellen Antworten ...Ich werde die Antwort akzeptieren, die am besten für mich funktioniert, wenn Stack Overflow mich ... – 1789040

+2

Das ist richtig, das lustige Ding ist, Xcode KÖNNTE & SOLLTE eine Warnung in solchen Fällen präsentieren. –

+0

Wenn Sie Objekte mit ganzen Zahlen vergleichen, warum gibt xcode keinen Fehler aus? – Tommyixi

4

rating ist ein Zeiger auf ein NSNumber-Objekt, wenn Sie mit == 0 vergleichen, werden Sie nur den Zeiger vergleichen.

Wenn Sie den Wert Wert mit 0 vergleichen möchten, müssen Sie den tatsächlichen Wert mit intValue erhalten, versuchen Sie es;

if ([rating intValue] == 0) { 
+0

Vielen Dank für Ihre schnellen Antworten ... Ich werde die Antwort akzeptieren, die am besten für mich funktioniert, wenn Stack Overflow es mir erlaubt ... – 1789040

3

Sie wollen von ihm ändern:

if (rating == 0) { 

Um

if ([rating intValue] == 0) {