我在访问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中怎么可能?
Answers:
for (NSString* key in xyz) {
id value = xyz[key];
// do stuff
}
尽管它NSDictionary
是少数几个可以枚举键而不是值的集合之一,但是它适用于每个符合NSFastEnumeration协议(在10.5+和iOS上可用)的类。我建议您在“ 集合编程主题”中阅读有关快速枚举的信息。
哦,我要补充一点,但是您在枚举集合时绝对不要修改集合。
for (NSString* key in [xyz allKeys])
在概念上是同一件事。
只是为了不遗漏使用块枚举键和值的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);
}];
*stop
用 您如何利用它?有参考吗?
我建议您阅读《可可收藏编程指南》中的“ 枚举:遍历集合的元素”部分。有一个您需要的示例代码。
快速枚举已在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" ...
}
您不会释放枚举器对象,也无法重置它。如果要重新开始,则必须从字典中请求一个新的枚举器对象。