使用文字语法,可以像这样使用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];
所以不那么可读。我想用新的文字语法来解决这个问题吗?
答案 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;
}
希望这会有所帮助,这就是你要找的东西吗?