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.