对于目标c中的每个循环,用于访问NSMutable字典

Sag*_*ari 261 enumeration objective-c nsdictionary key-value nsmutabledictionary

我发现在Objective-C中访问可变字典键和值有些困难.

假设我有这个:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
Run Code Online (Sandbox Code Playgroud)

我可以设置键和值.现在,我只想访问每个键和值,但我不知道键的数量.

在PHP中它非常简单,如下所示:

foreach ($xyz as $key => $value)
Run Code Online (Sandbox Code Playgroud)

如何在Objective-C中实现?

zne*_*eak 647

for (NSString* key in xyz) {
    id value = xyz[key];
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这适用于符合NSFastEnumeration协议(可在10.5+和iOS上使用)的每个类,但它NSDictionary是少数几个可以枚举键而不是值的集合之一.我建议你阅读集合编程主题中的快速枚举.

哦,我要补充然而,你应该永远不要同时通过它枚举修改的集合.

  • @ user76859403实际上,枚举字典枚举了密钥.`for(NSString*key in [xyz allKeys])`在概念上是相同的. (5认同)
  • 我想知道,不应该是:for(NSString*[xyz allKeys]中的键)?? 或者这不重要. (4认同)

Qui*_*lor 97

只是不遗漏使用块枚举键和值的10.6+选项...

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];
Run Code Online (Sandbox Code Playgroud)

如果您希望操作同时发生:

[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                              usingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];
Run Code Online (Sandbox Code Playgroud)

  • 嗯... objectEnumerator于1994年被添加,for(... in ...)在2006年左右,而Blocks在2009年被添加.枚举的块形式是自然的后果. (3认同)
  • 通过字典枚举的3种不同方式...嘿,这让我想起了"Strangest Language Feature"的答案,其中VB有7种不同的循环. (2认同)

Bro*_*son 13

如果你需要在枚举时改变字典:

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
Run Code Online (Sandbox Code Playgroud)


Lau*_*ble 5

我建议您阅读Cocoa 集合编程指南枚举:遍历集合的元素部分。有一个示例代码可以满足您的需求。


Avi*_*ash 5

枚举字典的最简单方法是

for (NSString *key in tDictionary.keyEnumerator) 
{
    //do something here;
}
Run Code Online (Sandbox Code Playgroud)

这里tDictionaryNSDictionary还是NSMutableDictionary要迭代。