9

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

其中我有一个NSDictionary *StoredAddresses

里面StoredAddresses,又是一把NSDictionary

我知道我可以使用,

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

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

4

4 回答 4

14

好吧,如果我没看错的话,你的字典中有字典。这就像任何其他对象一样工作:

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

如果您愿意,您可以合并呼叫:

NSString* Street=[[dictionaryOfAddresses objectForKey:@"Home Address"] objectForKey:@"Street"];
于 2012-09-19T08:32:22.807 回答
3

您可以使用该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,只要自定义类具有名称与键匹配的属性或实例变量,这都将起作用。

因此,例如,您可以替换具有声明属性、getter 方法或名为streetcity的实例变量(或名为_street_city的实例变量)的自定义类的实例,而不是使用NSDictionary家庭地址,并且仍然可以访问它一样的方法。Address

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

[contactDict setValue:@"Herndon" forKeyPath:@"addresses.home.city"];
于 2012-09-19T12:49:55.823 回答
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"];
于 2012-09-19T08:29:31.837 回答
1

另一种获取子字典的新方法可以生成一些简洁的代码是以下速记符号:

NSString *street = dictionaryOfAddresses[@"HomeAddress"][@"Street"];
于 2017-01-11T20:54:45.663 回答