修改getter以避免NSNull
我有可能包含对象的JSON响应。在我的模型对象我有这样的:修改getter以避免NSNull
_price3 = self.serverData[@"price3"];
我想作这样的:
_price3 = self.serverData[@"price3"] ? self.serverData[@"price3"] : @"0";
问题是,在这种结构将始终评估正确的,因为我想是一个对象。
为了防止在我的属性中我想修改getter到变量,检查,值是nsnull,如果是,返回类似@“0”的东西。那可能吗?
我在我的每一个应用程序中使用这种方法,你可以随便写。
-(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的机会,你会得到nil
或NULL
和应用程序不会崩溃。即使你的钥匙没有出现在响应主体中,这个东西也能工作。
如果您想在多个屏幕上使用它,请制作一个通用处理程序类并将其添加为类方法并使用它。我几乎用于所有应用程序,我的应用程序从未崩溃,因为这样的nil
和NULL
问题。
感谢您的帮助,这是很好的做法。 –
欢迎和感谢好友! – Pushkraj
[NSNull null]
是一个单独的对象,其通常在你最好要使用nil
作为值,这是由目标C禁止字典或阵列中使用。
所以
_price3 = self.serverData[@"price3"] == [NSNull null] ? @"0" : self.serverData[@"price3"];
@Glorfindlel伟大的,这是很好的解决方案。但究竟是什么[NSNull null]? –
@EvgeniyKleban在Obj-C数组和字典中不能包含'nil'。因此,我们在数组和字典中使用了一个特殊的单例对象,而不是'nil'。 – Sulthan
@Sulthan谢谢你的解释。 –
你可以使用的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
该是否有多种可能的解决方案来处理所有的'nil'和'NSNull'(是的,你必须同时处理)。例如,您可以尝试http://stackoverflow.com/a/23610588/669586。或者创建一个宏。 – Sulthan