Durchlaufen eines NSMutableDictionary

93

Wie durchlaufe ich alle Objekte in einem NSMutableDictionary unabhängig von den Schlüsseln?

Rupert
quelle

Antworten:

211

Ein Standardweg würde so aussehen

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}
Henrik P. Hessel
quelle
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.

Andrey Zverev
quelle
22

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

jv42
quelle
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
  }];
user3540599
quelle
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]);
    }
Alexander
quelle
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 */
}
Hendrik
quelle