przechodzenie przez NSMutableDictionary

Odpowiedzi:

211

Tak wyglądałby standardowy sposób

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}
Henrik P. Hessel
źródło
Gdyby tylko istniał sposób na zrobienie czegoś takiego: for (id key, value in myDict)to byłoby idealne.
Luis Artola,
4
Lepiej jednak iterować za pomocą kluczy (tj. id key in myDict.allKeys) Zamiast słownika. Pozwala to na zmianę słownika, co może być tym, co chcesz zrobić.
marcel salathe
29

możesz użyć

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

jeśli twój docelowy system operacyjny obsługuje bloki.

Andrey Zverev
źródło
22

Możesz użyć, [dict allValues]aby uzyskać jedną NSArrayze swoich wartości. Pamiętaj, że nie gwarantuje to żadnego porządku między połączeniami.

jv42
źródło
3
Użyłbym tego zamiast (klucz id w słowniku), szczególnie w słowniku mutowalnym, ponieważ ten ostatni zgłasza nieprzyjemny błąd, jeśli słownik jest modyfikowany podczas wyliczania.
sigsegv
„to nie gwarantuje” - jest to często potrzebne (większość języków ma taką wersję słownika, która gwarantuje porządek) - czy w praktyce zachowuje porządek?
Adam
@Adam Na MacOS X miałem dość pomieszaną kolejność (nie kolejność wstawiania, nie alfabetyczną, nic), ale spójną między wywołaniami.
jv42
Po co używać NSDictionary, jeśli mapowania nie mają znaczenia?
Stephen
2
@stephen Zwykle ma to znaczenie gdzieś i nie gdzie indziej. Otrzymujesz również ograniczenie klucza unikatowego, które może być przydatne w niektórych przypadkach.
jv42
4
  1. W przypadku prostej pętli szybkie wyliczanie jest nieco szybsze niż pętla oparta na blokach
  2. Łatwiej jest przeprowadzić wyliczanie współbieżne lub odwrotne z wyliczaniem opartym na blokach niż z szybkim wyliczaniem. Podczas wykonywania pętli z NSDictionary można uzyskać klucz i wartość w jednym trafieniu za pomocą modułu wyliczającego opartego na blokach, podczas gdy w przypadku szybkiego wyliczania należy użyć klucza, aby pobrać wartość w osobnej wiadomości wysyłanej

w szybkim wyliczeniu

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
  }];
user3540599
źródło
3

Nie musisz przypisywać wartości 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]);
    }
Aleksandra
źródło
2

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

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

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
Hendrik
źródło