Objective c NSDictionary中的NSDictionary

Objective c NSDictionary中的NSDictionary,objective-c,xcode,key,nsdictionary,Objective C,Xcode,Key,Nsdictionary,好的,我有一个.plist文件 其中我有一个NSDictionary*storedaddress 在storedaddirements中,还有另一小撮NSDictionary 我知道我可以用 if ([dictionaryOfAddresses objectForKey:@"StoredAddresses"]) 访问顶级NSD字典,但如何搜索存储地址中的键 这将返回StoredAddresses中的键数组 yourArray=[[dictionaryOfAddresses objectForK

好的,我有一个.plist文件

其中我有一个
NSDictionary*storedaddress

storedaddirements
中,还有另一小撮
NSDictionary

我知道我可以用

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

访问顶级NSD字典,但如何搜索存储地址中的键

这将返回StoredAddresses中的键数组

yourArray=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] allKeys];
然后,您可以打印yourArray并查看密钥,然后在了解密钥后,您可以使用

dict=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] objectForKey:[yourArray objectAtIndex:index_for_that_key]];


如果我没看错的话,字典里有字典。这与任何其他对象一样工作:

NSDictionary* Address=[dictionaryOfAddresses objectForKey:@"Home Address"];
NSString* Street=[Address objectForKey:@"Street"];
如果您想:

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

您可以使用
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"];
[contactDict setValue:@"Herndon" forKeyPath:@"addresses.home.city"];
请注意,如果自定义类具有名称与键匹配的属性或实例变量,则无论对象是
NSDictionary
的实例还是从
NSObject
派生的任何自定义类,这都将起作用

因此,例如,您可以替换具有声明属性、getter方法或名为streetcity的实例变量的自定义
address
类的实例,而不是使用
NSDictionary
(或名为\u street\u city的实例变量),并且仍然以相同的方式访问它

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

NSDictionary *contactDict = @{ @"name" : @"Jim Ray", @"addresses" : addressesDict };

NSString *street2 = [contactDict valueForKeyPath:@"addresses.home.street"];
NSString *city2 = [contactDict valueForKeyPath:@"addresses.home.city"];
[contactDict setValue:@"Herndon" forKeyPath:@"addresses.home.city"];

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

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

非常感谢您,我想我甚至可以在其中添加第三层?您可以添加任意多的“层”。唯一重要的是,您知道在每种情况下会得到什么对象。字符串和字典不是唯一的选项,您还可以有数组、日期或数字。字典只是“给定一个键,返回与之关联的值”。字典不关心键中存储的是什么类型的值。此外,使用现代Objective-C语法,您可以使用dictionaryOfAddresses[@“Home Address”][@“Street”]。:)