2010-10-12 11 views

Odpowiedz

197

standardowy sposób będzie wyglądać następująco

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

Znalazłem więcej sposobów, aby zrobić to źle, niż możesz wstrząsnąć kijem. Dziękuję Ci!!! – mpemburn

+0

Gdyby tylko istniał sposób na zrobienie czegoś takiego: 'for (id key, value in myDict)' to byłoby idealne. –

+0

Dzięki! Czasami łatwo zapomnieć o prostej składni. – abriggs

22

Można wykorzystać [dict allValues] uzyskać NSArray swoich wartości. Pamiętaj, że to nie gwarantuje żadnej kolejności między połączeniami.

+3

Chciałbym użyć tego na kluczu (id w słowniku), szczególnie w słowniku zmiennym, ponieważ ten drugi rzuca nieprzyjemny błąd, jeśli słownik jest modyfikowany podczas wyliczenia. – sigsegv

+0

"to nie gwarantuje" - jest to często potrzebne (większość języków ma wersję słownika, który gwarantuje kolejność) - czy w praktyce * zachowuje porządek? – Adam

+0

@Adam Na MacOS X, miałem dość zmiksowaną kolejność (nie kolejność wstawiania, nie alfabetyczną, nic), ale spójną między połączeniami. – jv42

26

można użyć

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

jeśli docelowy system operacyjny obsługuje bloki.

1

Innym sposobem jest użycie modułu Dicts Enumerator. Oto przykładowy kod z Apple:

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

while ((value = [enumerator nextObject])) { 
    /* code that acts on the dictionary’s values */ 
} 
2
  1. Do prostego pętli, szybkie wyliczenie jest nieco szybciej niż blok oparte pętla
  2. Łatwiej zrobić współbieżne lub odwrócić wyliczenie z wyliczeniem bloku oparte niż z szybkie wyliczenie Gdy zapętlenie z NSDictionary można klucz i wartość w jednym uderzeniu z wyliczający bloku oparte dostać, podczas gdy przy szybkim wyliczenia trzeba użyć klucza, aby pobrać wartość w osobnym komunikacie wysłać

w fas t wyliczenie

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

w blokach:

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

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

Nie trzeba przypisać wartość do zmiennej. Możesz uzyskać do niego bezpośredni dostęp za pomocą myDict[key].

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