2017-01-03 1 views
1

Ich habe JSON-Antwort, die möglicherweise Objekte enthalten kann. In meinem Modell-Objekte Ich mache diese:Getter ändern, um zu vermeiden NSNull

_price3 = self.serverData[@"price3"] ? self.serverData[@"price3"] : @"0"; 

Problem ist, in einer solchen Konstruktion ist es immer wahr ausgewertet wird, weil ich ein Objekt erraten ist:

_price3 = self.serverData[@"price3"]; 

ich so etwas machen wollte.

Um zu verhindern haben in meinen Eigenschaften möchte ich Getter zu Variablen ändern, zu überprüfen, wo der Wert ist nsnull, und wenn ja, geben Sie etwas wie @ "0". Ist das möglich?

+1

Das sind mehrere mögliche Lösungen sowohl 'nil' und' NSNull' zu handhaben (ja, haben Sie beide zu handhaben). Sie können http://stackoverflow.com/a/23610588/669586 zum Beispiel versuchen. Oder erstelle ein Makro. – Sulthan

Antwort

3

ich diese Methode verwenden in meiner jeder Anwendung. So

-(NSString*)checkNullValidation:(NSString *)key { 
    NSString *returnValue; 
    if(key == (id)[NSNull null] || [key isEqual:[NSNull null]] || key == nil) { 
     returnValue = @""; 
    } 
    else { 
     returnValue = [NSString stringWithFormat:@"%@",key]; 
    } 
    return returnValue; 
} 

, wenn ich Daten bin Parsen, ich mag überprüfen folgende Beispiel

NSDictionary *dictionaryTest = @{@"MyFirstKey":nil, @"MySecondKey":@"AwesomeValue"}; 
NSString *firstValue = [self checkNullValidation:[dictionaryTest valueForKey:@"MyFirstKey"]]; // It will be @"" instead of nil 
NSString *secondValue = [self checkNullValidation:[dictionaryTest valueForKey:@"MySecondKey"]]; // It will be @"AwesomeValue" 

So gibt es 0 Prozent Chancen, dass Sie nil oder NULL und Anwendung bekommen wird nicht abstürzen. Diese Funktion funktioniert auch dann, wenn Ihr Schlüssel nicht im Antworttext vorhanden ist.

Wenn Sie es auf mehreren Bildschirmen verwenden möchten, erstellen Sie eine allgemeine Handler-Klasse, fügen Sie diese als Klassenmethode hinzu und verwenden Sie sie. Ich habe fast in allen Anwendungen verwendet und meine Apps stürzten nie wegen solcher Probleme nil und NULL.

+0

danke für deine Hilfe, das ist ein guter Ansatz. –

+0

Willkommen und danke Buddy! – Pushkraj

3

[NSNull null] ist ein Singleton-Objekt, die oft in Wörterbüchern oder Arrays verwendet wird, wo Sie würde wollen nil als Wert verwenden, die von Objective-C verboten ist.

So können Sie einfach schreiben

_price3 = self.serverData[@"price3"] == [NSNull null] ? @"0" : self.serverData[@"price3"]; 
+0

@Glorfindelel toll, das ist eine gute Lösung. Aber was genau ist [NSNull null]? –

+0

@EvgeniyKleban In Obj-C-Arrays und Wörterbüchern können keine 'nil' enthalten. Deshalb haben wir ein spezielles Singleton-Objekt, das in Arrays und Dictionaries anstelle von "nil" verwendet wird. – Sulthan

+0

@Sultan danke für die Erklärung. –

0

Sie NSDictionary Kategorie wie diese verwenden:

@implementation NSDictionary (NilNull) 

- (id)optionalObjectForKey:(id)key { 
    return [self optionalObjectForKey:key defaultValue:nil]; 
} 

- (id)optionalObjectForKey:(id)key defaultValue:(id)defaultValue { 
    id obj = [self objectForKey:key]; 
    return (obj == [NSNull null] || !obj) ? defaultValue : obj; 
} 

@end 
Verwandte Themen