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

如何设置 twilio 通话记录?

NSDictionary 里面的 NSDictionary

NSDictionary 里面的 NSDictionary

字典NSDictionary和NSMutableDictionary的使用

需要帮助从 NSDictionary 设置单元格的 TextLabel