2012-09-19 74 views
4

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

在这我有一个NSDictionary *StoredAddresses

里面StoredAddresses,是NSDictionary

另一一把我知道我可以使用,

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

要访问顶级NSDictionaries,但我如何搜索存储地址内的密钥?

回答

10

那么,我如果我正确地阅读了这些内容,则可以在字典中找到字典。这个工程就像任何其他对象:

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

非常感谢,我想我甚至可以添加第三层? –

+0

您可以根据需要添加尽可能多的“图层”。唯一重要的是你知道你在每种情况下得到的是什么对象。字符串和字典不是唯一的选择,你可以有数组,日期或数字。字典只是“给予一把钥匙,返回与之相关的价值”。字典不关心在一个密钥中存储了什么样的值。 –

+1

此外,使用现代的Objective-C语法,您可以使用dictionaryOfAddresses [@“Home Address”] [@“Street”]代替。 :) –

0

这将返回内部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"]; 
+0

谢谢你,这是辉煌的! –

+0

不用客气。 – Neo

2

可以使用NSKeyValueCoding方法valueForKeyPath:访问嵌套对象的属性:

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

你可以,如果你想将呼叫组合。例如,给出下面的字典...

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实例或从下降的任何自定义类工作,前提是自定义类具有名称与键匹配的属性或实例变量。

因此,例如,而不是使用NSDictionary的家庭地址,你可以代替已宣布的属性,getter方法,或命名为街道城市(或实例变量实例变量定制Address类的一个实例名称为_street_city),并仍以相同的方式访问它。

如果包含目标属性的对象是可变的(例如NSMutableDictionary一个实例),你甚至可以修改使用相同的机制的值,例如:

[contactDict setValue:@"Herndon" forKeyPath:@"addresses.home.city"]; 
1

获得分字典的另一种新方法这使得一些整齐的代码是以下速记符号:

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