Objective c NSDictionary中的NSDictionary
好的,我有一个.plist文件 其中我有一个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
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方法或名为street和city的实例变量的自定义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”]。:)