bucle a través de un NSMutableDictionary

Respuestas:

211

Una forma estándar se vería así

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}
Henrik P. Hessel
fuente
Si tan solo hubiera una forma de hacer algo como: for (id key, value in myDict)sería perfecto.
Luis Artola
4
Sin embargo, es mejor iterar a través de las claves (es decir id key in myDict.allKeys), en lugar del diccionario. Esto le permite mutar el diccionario, que podría ser lo que quiera hacer.
marcel salathe
29

puedes usar

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

si su sistema operativo de destino admite bloques.

Andrey Zverev
fuente
22

Puede utilizar [dict allValues]para obtener uno NSArrayde sus valores. Tenga en cuenta que no garantiza ningún orden entre llamadas.

jv42
fuente
3
Usaría este sobre la (clave de identificación en el diccionario), especialmente en un diccionario mutable, ya que este último arroja un error desagradable si el diccionario se modifica mientras se enumera.
sigsegv
"no garantiza" - esto se necesita con frecuencia (la mayoría de los idiomas tienen una versión de diccionario que SI garantiza el orden) - ¿ en la práctica conserva el orden?
Adam
@Adam En MacOS X, tenía un orden bastante confuso (no orden de inserción, no alfabético, nada), pero consistente entre llamadas.
jv42
¿Por qué utilizar un NSDictionary si las asignaciones no importan?
Stephen
2
@stephen Por lo general, importa en algún lugar y no en otro. También obtiene la restricción de clave única que podría ser útil para algunos casos.
jv42
4
  1. Para un bucle simple, la enumeración rápida es un poco más rápida que el bucle basado en bloques
  2. Es más fácil hacer una enumeración simultánea o inversa con la enumeración basada en bloques que con la enumeración rápida Al realizar un bucle con NSDictionary, puede obtener la clave y el valor de un solo resultado con un enumerador basado en bloques, mientras que con la enumeración rápida debe usar la clave para recuperar el valor en un mensaje separado enviar

en enumeración rápida

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

en Bloques:

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

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

No es necesario asignar valor a una variable. Puede acceder a él directamente con myDict[key].

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

Otra forma es utilizar Dicts Enumerator. Aquí hay un código de muestra de Apple:

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

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
Hendrik
fuente