修改getter以避免NSNull

时间:2017-01-03 09:13:41

标签: ios objective-c

我有可能包含对象的JSON响应。在我的模型对象中,我做到了:

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

我想做类似的事情:

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

问题是,在这样的构造中,它总是会评估为真,因为我猜是一个对象。

为了防止在我的属性中有我想要修改getter到变量,检查,其中value是nsnull,如果是,则返回类似@“0”的内容。这可能吗?

3 个答案:

答案 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%的机会获得nilNULL并且应用程序不会崩溃。即使您的密钥在响应正文中不存在,这件事也会有效。

如果要在多个屏幕上使用它,请创建一个公共处理程序类并将其添加为类方法并使用它。我几乎在所有应用程序中都使用过,因为nilNULL问题,我的应用程序从未崩溃。

答案 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