我发现在Objective-C中访问可变字典键和值有一些困难。
假设我有这个:
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
我可以设置键和值。现在,我只想访问每个键和值,但我不知道设置的键的数量。
在PHP中,这很简单,如下所示:
foreach ($xyz as $key => $value)
这在Objective-C中是如何实现的?
我发现在Objective-C中访问可变字典键和值有一些困难。
假设我有这个:
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
我可以设置键和值。现在,我只想访问每个键和值,但我不知道设置的键的数量。
在PHP中,这很简单,如下所示:
foreach ($xyz as $key => $value)
这在Objective-C中是如何实现的?
for (NSString* key in xyz) {
id value = xyz[key];
// do stuff
}
这适用于所有符合NSFastEnumeration协议的类(在10.5+和iOS上可用),尽管NSDictionary是少数几个允许你枚举键而不是值的集合之一。我建议您阅读集合编程主题中的快速枚举。
哦,我应该补充的是,你永远不应该修改一个集合,同时枚举它。
快速枚举在10.5和iPhone OS中添加,它的速度要快得多,而不仅仅是语法糖。如果你必须以旧的运行时为目标(即10.4和向后),你将不得不使用旧的枚举方法:
NSDictionary *myDict = ... some keys and values ...
NSEnumerator *keyEnum = [myDict keyEnumerator];
id key;
while ((key = [keyEnum nextObject]))
{
id value = [myDict objectForKey:key];
... do work with "value" ...
}
不释放枚举器对象,也不能重置它。如果想重新开始,必须从字典中请求一个新的枚举器对象。
只是为了不遗漏10.6+选项枚举键和值使用块…
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
NSLog(@"%@ = %@", key, object);
}];
如果你想让这些动作同时发生:
[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id key, id object, BOOL *stop) {
NSLog(@"%@ = %@", key, object);
}];
如果你需要在枚举时改变字典:
for (NSString* key in xyz.allKeys) {
[xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
枚举字典最简单的方法是
for (NSString *key in tDictionary.keyEnumerator)
{
//do something here;
}
tDictionary是你想要迭代的NSDictionary或NSMutableDictionary。