您可以使用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"];