NSMutableDictionaryをループする


回答:


211

標準的な方法は次のようになります

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}

何かをする方法があったとしても、for (id key, value in myDict)それは完璧です。
Luis Artola 2013

4
id key in myDict.allKeys辞書ではなく、キーを反復処理する(つまり)のが適切です。これにより、辞書を変更することができます。
マルセルサラテ2014年

29

あなたは使うことができます

[myDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
    // do something with key and obj
}];

ターゲットOSがブロックをサポートしている場合。


22

を使用[dict allValues]NSArrayて値を取得できます。呼び出し間の順序を保証するものではないことに注意してください。


3
私はこれを(辞書のidキー)上で使用します。特に、変更可能な辞書では、列挙中に辞書が変更されると後者は厄介なエラーをスローするためです。
sigsegv

「保証しません」-これは頻繁に必要です(ほとんどの言語には、順序を保証するバージョンの辞書があります)- 実際には順序を保持しますか?
アダム

@Adam MacOS Xでは、順序がかなり混ざっていました(挿入順ではなく、アルファベット順ではなく、何もありません)が、呼び出し間で一貫しています。
jv42

マッピングが重要ではないのに、なぜNSDictionaryを使用するのですか?
スティーブン

2
@stephen通常、それはどこかで重要であり、他の場所では重要ではありません。また、場合によっては役立つ一意のキー制約も取得します。
jv42

4
  1. 単純なループの場合、高速列挙はブロックベースのループよりも少し高速です
  2. 高速列挙よりもブロックベースの列挙の方が並行列挙または逆列挙を実行する方が簡単です別のメッセージ送信の値

高速列挙で

for(id key in myDictionary) {
   id value = [myDictionary objectForKey:key];
  // do something with key and obj
}

ブロックで:

[myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

   // do something with key and obj
  }];

3

変数に値を割り当てる必要はありません。で直接アクセスできますmyDict[key]

    for(id key in myDict) {
        NSLog(@"Key:%@ Value:%@", key, myDict[key]);
    }

2

もう1つの方法は、Dicts列挙子を使用することです。Appleからのサンプルコードは次のとおりです。

NSEnumerator *enumerator = [myDictionary objectEnumerator];
id value;

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.