2010-10-12 14 views

Respuesta

197

Una forma estándar se vería así

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

Me he encontrado con más formas de hacer esto mal de lo que se puede sacudir un palo. ¡¡¡Gracias!!! – mpemburn

+0

Si hubiera una forma de hacer algo como: 'for (id key, value in myDict)' eso sería perfecto. –

+0

Gracias! Fácil de olvidar la sintaxis simple a veces. – abriggs

22

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

+3

Utilizaría este sobre la (clave de identificación en el diccionario), especialmente en un diccionario mutable, ya que este último arroja un desagradable error si el diccionario se modifica mientras se enumera. – sigsegv

+0

"no garantiza" - esto se necesita con frecuencia (la mayoría de los idiomas tienen una versión del diccionario que garantiza el orden) - ¿* en la práctica * preserva el orden? – Adam

+0

@ Adam En MacOS X, tenía un orden bastante confuso (no orden de inserción, no alfabético, nada), pero consistente entre llamadas. – jv42

26

puede utilizar

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

si su sistema operativo es compatible con bloques de destino.

1

Otra forma es usar el enumerador de diccionarios. Aquí algunos ejemplos de código de Apple:

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

while ((value = [enumerator nextObject])) { 
    /* code that acts on the dictionary’s values */ 
} 
2
  1. Para bucle simple, rápida enumeración es un poco más rápido que la basado en bloques de bucle
  2. Es más fácil hacer concurrente o enumeración con la enumeración basada en bloques que con revertir rápida enumeración Cuando bucle con NSDictionary se puede obtener la clave y el valor de un solo golpe con un empadronador basado en bloques, mientras que con la enumeración rápida usted tiene que utilizar la clave para recuperar el valor en un mensaje aparte enviar

en fas t enumeración

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

en los Bloques:

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

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

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

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