NSDictionary 里面的 NSDictionary
Posted
技术标签:
【中文标题】NSDictionary 里面的 NSDictionary【英文标题】:NSDictionary inside NSDictionary 【发布时间】:2012-09-19 08:26:33 【问题描述】:好的,我有一个 .plist 文件,
其中我有一个NSDictionary *StoredAddresses
,
在StoredAddresses
里面,是另外一把NSDictionary
我知道我可以使用,
if ([dictionaryOfAddresses objectForKey:@"StoredAddresses"])
要访问*** NSDictionaries,但如何在存储的地址中搜索键?
【问题讨论】:
【参考方案1】:好吧,如果我没看错的话,你的字典中有字典。这就像任何其他对象一样工作:
NSDictionary* Address=[dictionaryOfAddresses objectForKey:@"Home Address"];
NSString* Street=[Address objectForKey:@"Street"];
如果您愿意,可以合并调用:
NSString* Street=[[dictionaryOfAddresses objectForKey:@"Home Address"] objectForKey:@"Street"];
【讨论】:
非常感谢,我想我什至可以在其中添加第三层? 您可以根据需要添加任意数量的“层”。唯一重要的是你知道在每种情况下你得到什么对象。字符串和字典不是唯一的选择,你也可以有数组、日期或数字。字典只是“给定一个键,返回与之关联的值”。字典不关心键中存储了什么样的值。 同样使用现代 Objective-C 语法,您可以使用 dictionaryOfAddresses[@"Home Address"][@"Street"] 代替。 :)【参考方案2】:您可以使用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
派生的任何自定义类,只要自定义类具有名称与键匹配的属性或实例变量,这将起作用。
因此,例如,您可以替换自定义 Address
类的实例,而不是使用 NSDictionary
作为家庭地址,该类已声明属性、getter 方法或名为 street 的实例变量和 city(或名为 _street 和 _city 的实例变量),并且仍然以相同的方式访问它。
如果包含目标属性的对象是可变的(例如NSMutableDictionary
的实例),您甚至可以使用相同的机制修改该值,例如:
[contactDict setValue:@"Herndon" forKeyPath:@"addresses.home.city"];
【讨论】:
【参考方案3】:这将返回 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"];
【讨论】:
【参考方案4】:另一种获取子词典的新方法可以生成一些简洁的代码,是以下速记符号:
NSString *street = dictionaryOfAddresses[@"HomeAddress"][@"Street"];
【讨论】:
以上是关于NSDictionary 里面的 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章
带有 JSON 格式字符串的文件,如何将文件内容读入 NSDictionary