我有可能包含对象的JSON响应。在我的模型对象中,我做到了:
_price3 = self.serverData[@"price3"];
我想做类似的事情:
_price3 = self.serverData[@"price3"] ? self.serverData[@"price3"] : @"0";
问题是,在这样的构造中,它总是会评估为真,因为我猜是一个对象。
为了防止在我的属性中有我想要修改getter到变量,检查,其中value是nsnull,如果是,则返回类似@“0”的内容。这可能吗?
答案 0 :(得分:3)
[NSNull null]
是一个单例对象,通常用在字典或数组中,您希望使用nil
作为值,这是禁止的目标C
所以你可以写
_price3 = self.serverData[@"price3"] == [NSNull null] ? @"0" : self.serverData[@"price3"];
答案 1 :(得分: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%的机会获得nil
或NULL
并且应用程序不会崩溃。即使您的密钥在响应正文中不存在,这件事也会有效。
如果要在多个屏幕上使用它,请创建一个公共处理程序类并将其添加为类方法并使用它。我几乎在所有应用程序中都使用过,因为nil
和NULL
问题,我的应用程序从未崩溃。
答案 2 :(得分:1)
您可以像这样使用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