loop attraverso un NSMutableDictionary


Risposte:


211

Un modo standard sarebbe simile a questo

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

Se solo ci fosse un modo per fare qualcosa del genere: for (id key, value in myDict)sarebbe perfetto.
Luis Artola

4
Meglio iterare attraverso le chiavi (cioè id key in myDict.allKeys), piuttosto che il dizionario. Ciò ti consente di modificare il dizionario, che potrebbe essere ciò che desideri fare.
marcel salathe

29

Puoi usare

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

se il tuo sistema operativo di destinazione supporta i blocchi.


22

Puoi usare [dict allValues]per ottenere uno NSArraydei tuoi valori. Tieni presente che non garantisce alcun ordine tra le chiamate.


3
Lo userei su (chiave id nel dizionario), specialmente su un dizionario mutabile, poiché quest'ultimo genera un brutto errore se il dizionario viene modificato mentre viene enumerato.
sigsegv

"non garantisce" - questo è spesso necessario (la maggior parte delle lingue ha una versione del dizionario che GARANTISCE l'ordine) - in pratica preserva l'ordine?
Adam

@Adam Su MacOS X, avevo un ordine piuttosto confuso (non l'ordine di inserimento, non alfabetico, niente), ma coerente tra le chiamate.
jv42

Perché usare un NSDictionary se le mappature non contano?
stephen

2
@stephen Di solito è importante da qualche parte e non altrove. Ottieni anche il vincolo di chiave univoco che potrebbe essere utile in alcuni casi.
jv42

4
  1. Per il ciclo semplice, l'enumerazione rapida è un po 'più veloce del ciclo basato su blocchi
  2. È più facile eseguire l'enumerazione simultanea o inversa con l'enumerazione basata su blocco che con l'enumerazione rapida Quando si esegue il ciclo con NSDictionary è possibile ottenere chiave e valore in un colpo con un enumeratore basato su blocco, mentre con l'enumerazione rapida è necessario utilizzare la chiave per recuperare il valore in un messaggio separato invia

in rapida enumerazione

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

in blocchi:

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

   // do something with key and obj
  }];

3

Non è necessario assegnare un valore a una variabile. Puoi accedervi direttamente con myDict[key].

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

2

Un altro modo è usare l'Enumeratore Dicts. Ecco un po 'di codice di esempio da Apple:

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

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.