好,我有一个的.plist文件,的NSDictionary内的NSDictionary
在这我有一个NSDictionary *StoredAddresses
,
里面StoredAddresses
,是NSDictionary
另一一把我知道我可以使用,
if ([dictionaryOfAddresses objectForKey:@"StoredAddresses"])
要访问顶级NSDictionaries,但我如何搜索存储地址内的密钥?
好,我有一个的.plist文件,的NSDictionary内的NSDictionary
在这我有一个NSDictionary *StoredAddresses
,
里面StoredAddresses
,是NSDictionary
另一一把我知道我可以使用,
if ([dictionaryOfAddresses objectForKey:@"StoredAddresses"])
要访问顶级NSDictionaries,但我如何搜索存储地址内的密钥?
那么,我如果我正确地阅读了这些内容,则可以在字典中找到字典。这个工程就像任何其他对象:
NSString* Street=[[dictionaryOfAddresses objectForKey:@"Home Address"] objectForKey:@"Street"];
这将返回内部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"];
谢谢你,这是辉煌的! –
不用客气。 – Neo
可以使用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"];
获得分字典的另一种新方法这使得一些整齐的代码是以下速记符号:
NSString *street = dictionaryOfAddresses[@"HomeAddress"][@"Street"];
非常感谢,我想我甚至可以添加第三层? –
您可以根据需要添加尽可能多的“图层”。唯一重要的是你知道你在每种情况下得到的是什么对象。字符串和字典不是唯一的选择,你可以有数组,日期或数字。字典只是“给予一把钥匙,返回与之相关的价值”。字典不关心在一个密钥中存储了什么样的值。 –
此外,使用现代的Objective-C语法,您可以使用dictionaryOfAddresses [@“Home Address”] [@“Street”]代替。 :) –