2017-01-03 66 views
1

我有可能包含對象的JSON響應。在我的模型對象我有這樣的:修改getter以避免NSNull

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

我想作這樣的:

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

問題是,在這種結構將始終評估正確的,因爲我想是一個對象。

爲了防止在我的屬性中我想修改getter到變量,檢查,值是nsnull,如果是,返回類似@「0」的東西。那可能嗎?

+1

該是否有多種可能的解決方案來處理所有的'nil'和'NSNull'(是的,你必須同時處理)。例如,您可以嘗試http://stackoverflow.com/a/23610588/669586。或者創建一個宏。 – Sulthan

回答

3

我在我的每一個應用程序中使用這種方法,你可以隨便寫。

-(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; 
} 

所以每當我解析數據,我做檢查像下面 例如,

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" 

因此,有百分之0的機會,你會得到nilNULL和應用程序不會崩潰。即使你的鑰匙沒有出現在響應主體中,這個東西也能工作。

如果您想在多個屏幕上使用它,請製作一個通用處理程序類並將其添加爲類方法並使用它。我幾乎用於所有應用程序,我的應用程序從未崩潰,因爲這樣的nilNULL問題。

+0

感謝您的幫助,這是很好的做法。 –

+0

歡迎和感謝好友! – Pushkraj

3

[NSNull null]是一個單獨的對象,其通常在你最好使用nil作爲值,這是由目標C禁止字典或陣列中使用。

所以

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

@Glorfindlel偉大的,這是很好的解決方案。但究竟是什麼[NSNull null]? –

+0

@EvgeniyKleban在Obj-C數組和字典中不能包含'nil'。因此,我們在數組和字典中使用了一個特殊的單例對象,而不是'nil'。 – Sulthan

+0

@Sulthan謝謝你的解釋。 –

0

你可以使用的NSDictionary類是這樣的:

@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 
相關問題