Durchlaufen eines NSMutableDictionary


Antworten:


211

Ein Standardweg würde so aussehen

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

Wenn es nur eine Möglichkeit for (id key, value in myDict)gäbe, so etwas zu tun: Das wäre perfekt.
Luis Artola

4
Es ist jedoch besser, die Schlüssel (dh id key in myDict.allKeys) zu durchlaufen , als das Wörterbuch. Auf diese Weise können Sie das Wörterbuch mutieren, was möglicherweise das ist, was Sie tun möchten.
Marcel Salathe

29

Sie können verwenden

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

wenn Ihr Zielbetriebssystem Blöcke unterstützt.


22

Sie können verwenden [dict allValues], um einen NSArrayIhrer Werte zu erhalten. Beachten Sie, dass keine Reihenfolge zwischen Anrufen garantiert wird.


3
Ich würde diesen über dem (ID-Schlüssel im Wörterbuch) verwenden, insbesondere bei einem veränderlichen Wörterbuch, da letzteres einen bösen Fehler auslöst, wenn das Wörterbuch während der Aufzählung geändert wird.
Sigsegv

"es garantiert nicht" - dies wird häufig benötigt (die meisten Sprachen haben eine Version des Wörterbuchs, die Ordnung garantiert) - bewahrt es in der Praxis die Ordnung?
Adam

@Adam Unter MacOS X hatte ich eine ziemlich durcheinandergebrachte Reihenfolge (keine Einfügereihenfolge, nicht alphabetisch, nichts), aber zwischen den Aufrufen konsistent.
Jv42

Warum ein NSDictionary verwenden, wenn die Zuordnungen keine Rolle spielen?
Stephen

2
@stephen Normalerweise ist es irgendwo wichtig und nicht anderswo. Sie erhalten auch die eindeutige Schlüsselbeschränkung, die in einigen Fällen nützlich sein kann.
Jv42

4
  1. Bei einer einfachen Schleife ist die schnelle Aufzählung etwas schneller als die blockbasierte Schleife
  2. Es ist einfacher, mit blockbasierter Aufzählung eine gleichzeitige oder umgekehrte Aufzählung durchzuführen als mit schneller Aufzählung. Wenn Sie mit NSDictionary eine Schleife ausführen, können Sie mit einem blockbasierten Aufzähler Schlüssel und Wert in einem Treffer erhalten, während Sie bei schneller Aufzählung den Schlüssel zum Abrufen des Schlüssels verwenden müssen Wert in einer separaten Nachricht senden

in schneller Aufzählung

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

in Blöcken:

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

   // do something with key and obj
  }];

3

Sie müssen einer Variablen keinen Wert zuweisen. Sie können direkt mit darauf zugreifen myDict[key].

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

2

Eine andere Möglichkeit ist die Verwendung des Dicts Enumerator. Hier ist ein Beispielcode von Apple:

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

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.