安全订阅NSDictionary

时间:2017-03-02 09:08:37

标签: ios objective-c nsdictionary objective-c-literals

使用文字语法,可以像这样使用NSDictionary *字典来获取objectForKey

NSDictionary * dictionary;
id object = dictionary[key];

但是如果字典的类型是id类型并且您尝试编写

id dictionary;
id object = dictionary[key];

这将有效,直到你的字典真的是一本字典,否则会崩溃。

解决方案是使用方法

-(id)safeObject:(id)object forKey:(id)aKey {
    if (![object isKindOfClass:[NSDictionary class]]) {
        return nil;
    }
    return [object objectForKeyedSubscript:aKey];
}

所以现在当我这样称呼

id dictionary;
id object = [self safeObject:dictionary forKey:key];

这不会崩溃。但是这个问题的问题在于,如果我必须深入嵌套字典中,例如

id object = dictionary[key1][subKey1][subsubKey1];

使用旧语法编写文字语法非常方便,就像

一样
id mainObject = [self safeObject:dictionary forKey:key1];
id subObject = [self safeObject:mainObject forKey:subKey1];
id object = [self safeObject:subObject forKey:subsubKey1];  

所以不那么可读。我想用新的文字语法来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您可以使用valueForKeyPath,例如

id dictionary = @{@"key":@{@"subkey" : @{ @"subsubkey" : @"value"}}};
id object = [self safeObject:dictionary];
id value = [object valueForKeyPath:@"key.subkey.subsubkey"];

还要稍微更改safeObject以检查它是否是字典,

- (id)safeObject:(id)object {
    if (![object isKindOfClass:[NSDictionary class]]) {
        return nil;
    }
    return object;
}

希望这会有所帮助,这就是你要找的东西吗?