0

使用文字语法,可以像这样使用 NSDictionary *dictionary 来获取 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];  

所以没有那么多可读性。我想用新的文字语法来解决这个问题,这可能吗?

4

1 回答 1

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;
}

希望这会有所帮助,这是您要找的吗?

于 2017-03-02T10:00:20.303 回答