NSDictionary内嵌NSDictionary

9

好的,我有一个.plist文件,

里面有一个NSDictionary *StoredAddresses

StoredAddresses内,另有一些NSDictionary

我知道我可以使用,

if ([dictionaryOfAddresses objectForKey:@"StoredAddresses"])

要访问顶层NSDictionaries,但如何搜索存储的地址中的键?

4个回答

14

如果我理解正确的话,你有一个字典中嵌套了其他的字典。这和其他对象一样运作:

NSDictionary* Address=[dictionaryOfAddresses objectForKey:@"Home Address"];
NSString* Street=[Address objectForKey:@"Street"];

如果您想要,您可以将这些调用合并:

NSString* Street=[[dictionaryOfAddresses objectForKey:@"Home Address"] objectForKey:@"Street"];

非常感谢,我可以假设我可以添加第三层吗? - Taskinul Haque
你可以添加任意数量的“层”。唯一重要的是,你知道每种情况下获取的对象是什么。字符串和字典并不是唯一的选择,你也可以有数组、日期或数字等选项。字典只是“给定一个键,返回与之关联的值”。字典不关心在键处存储了什么类型的值。 - Christian Stieber
1
同时,使用现代化的Objective-C语法,你可以使用dictionaryOfAddresses[@"Home Address"][@"Street"]。 :) - Nico

4
您可以使用NSKeyValueCoding方法valueForKeyPath:来访问嵌套对象的属性。例如,给定以下字典...
NSDictionary *homeAddressDict = @{ @"street" : @"2 Elm St.", @"city" : @"Reston" };
NSDictionary *addressesDict = @{ @"home" : homeAddressDict };

如果您想访问嵌套的home字典的值,可以按照以下方式进行:

NSString *street = [addressesDict valueForKeyPath:@"home.street"];
NSString *city = [addressesDict valueForKeyPath:@"home.city"];

对于更深层次的路径,例如:

NSDictionary *contactDict = @{ @"name" : @"Jim Ray", @"addresses" : addressesDict };

NSString *street2 = [contactDict valueForKeyPath:@"addresses.home.street"];
NSString *city2 = [contactDict valueForKeyPath:@"addresses.home.city"];

请注意,这将适用于无论对象是 NSDictionary 还是任何继承自 NSObject 的自定义类,只要自定义类具有与键匹配的属性或实例变量的名称即可。例如,可以替换使用 NSDictionary 作为家庭地址,可以用声明了属性、getter方法或实例变量名为streetcity(或实例变量名为_street_city)的自定义 Address 类的实例来代替,并且仍然可以以相同的方式访问它。
如果包含目标属性的对象是可变的(例如 NSMutableDictionary 的实例),则甚至可以使用相同的机制修改该值,例如:
[contactDict setValue:@"Herndon" forKeyPath:@"addresses.home.city"];

1

这将返回StoredAddresses内部键的数组

yourArray=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] allKeys];

然后您可以打印yourArray并查看键,然后在了解键之后,您可以使用以下任一方式访问

dict=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] objectForKey:[yourArray objectAtIndex:index_for_that_key]];

或者

dict=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] objectForKey:@"key_for_your_dict"];

1

另一种获取子字典的新方法是使用以下简写符号:

NSString *street = dictionaryOfAddresses[@"HomeAddress"][@"Street"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接