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