2010-10-12 8 views

Antwort

197

Ein Standardverfahren wie dieses

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

Ich habe mehr Möglichkeiten gefunden, dies falsch zu machen, als Sie einen Stock schütteln können. Vielen Dank!!! – mpemburn

+0

Wenn es nur einen Weg gäbe: 'für (ID-Schlüssel, Wert in myDict) wäre das perfekt. –

+0

Danke! Einfach, die einfache Syntax manchmal zu vergessen. – abriggs

22

aussehen würden Sie [dict allValues] können eine NSArray Ihrer Werte zu erhalten. Beachten Sie, dass es keine Reihenfolge zwischen Anrufen garantiert.

+3

Ich würde diese über den (ID-Schlüssel im Wörterbuch) verwenden, besonders in einem veränderbaren Wörterbuch, da letzterer einen unangenehmen Fehler verursacht, wenn das Wörterbuch während der Aufzählung geändert wird. – sigsegv

+0

"es garantiert nicht" - das wird häufig benötigt (die meisten Sprachen haben eine Version des Wörterbuchs, das die Reihenfolge garantiert) - macht es * in der Praxis * Ordnung aufrechtzuerhalten? – Adam

+0

@Adam Auf MacOS X hatte ich ziemlich Reihenfolge durcheinander (nicht Reihenfolge der Einfügung, nicht alphabetisch, nichts), aber konsistent zwischen den Anrufen. – jv42

26

können Sie

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

wenn Ihr Ziel OS-Bausteine ​​unterstützt verwenden.

1

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 */ 
} 
2
  1. Für einfache Schleife, schnelle Aufzählung ist ein bisschen schneller als blockbasierte Schleife
  2. Es ist einfacher, gleichzeitig zu tun oder Reverse-Enumeration mit blockbasierten Aufzählung als mit schnelle Aufzählung Wenn mit NSDictionary Looping Sie können mit einem blockbasierten Enumerator in einem Hit Schlüssel und Wert erhalten, während bei schnellen Auszählung Sie den Schlüssel verwenden, den Wert in einer separaten Nachricht senden

in fas abrufen t Aufzählung

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

in Blöcke:

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

    // do something with key and obj 
    }]; 
3

Sie brauchen nicht Wert einer Variablen zugewiesen werden soll. Sie können direkt darauf zugreifen mit .

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