Me estoy encontrando algunas dificultades en el acceso mutable diccionario de claves y valores en Objective-C.

Supongamos que tengo este:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];

Puedo conjunto de claves y valores. Ahora, sólo quiero acceder a cada una clave y un valor, pero no sé el número de teclas set.

En PHP es muy fácil, algo como lo siguiente:

foreach ($xyz as $key => $value)

¿Cómo es posible que en Objective-C?

7 Comentarios

  1. 642
    for (NSString* key in xyz) {
        id value = xyz[key];
        //do stuff
    }

    Esto funciona para cada clase que se ajusta a la NSFastEnumeration protocolo (disponible en 10.5+ y iOS), aunque NSDictionary es una de las pocas colecciones que le permite enumerar las claves en lugar de valores. Le sugiero que lea acerca de rápida enumeración en el Las Colecciones De La Programación Tema.

    Oh, debo añadir, sin embargo, que usted debe NUNCA modificar una colección mientras se enumeran a través de ella.

    • Me preguntaba, debe nt lo han sido: para (NSString* tecla de [xyz allKeys]) ?? O no importa realmente.
    • La enumeración de un diccionario, de hecho, enumera las teclas. for (NSString* key in [xyz allKeys]) es conceptualmente la misma cosa.
    • Utilice [xyz allKeys] si necesita mutar el diccionario, mientras que la enumeración de las teclas. Véase mi respuesta a continuación.
    • Es este bucle de retorno mismo orden todo el tiempo? O ¿necesitamos otra forma de uso es para formato tableview secciones?
    • El cacao, los diccionarios son desordenadas. Esto significa que el orden en el cual se puede recorrer en cambio, siempre y cuando se modifique.
  2. 97

    Sólo para no dejar fuera de los 10.6+ opción para enumerar las claves y valores con el uso de bloques de…

    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
        NSLog(@"%@ = %@", key, object);
    }];

    Si quieres las acciones que ocurren simultáneamente:

    [dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                                  usingBlock:^(id key, id object, BOOL *stop) {
        NSLog(@"%@ = %@", key, object);
    }];
    • 3 maneras diferentes para enumerar a través de un diccionario . . . je, esto me recuerda a la «Extraña Característica del Lenguaje» respuesta donde VB tiene 7 diferentes tipos de bucles.
    • Bueno… objectEnumerator fue añadido en 1994, la que(… en …) en el 2006, y los Bloques que se han añadido en el año 2009. La forma del bloque de enumeración es natural de la lluvia radioactiva.
    • Esto parece ser más rápido que el estándar de en construcción: oneofthesedaysblog.com/block-vs-for-in-objective-c-enumeration
    • Comenté en ese post, que en realidad se compara bloque basado en la enumeración con un viejo bucle para, no para…en la construcción.
    • También disponible en ios 4.0+
    • ¿Cuál es la *stop para? ¿Cómo se puede hacer uso de ella? Cualquier referencia?
    • Conjunto de *stop = SÍ;para detener cualquier enumeración dentro del bloque
    • También, debido a la naturaleza de Objective C y su falta de capacidad de sobrecarga de método, puede dar la clave y el objeto. Por ejemplo: ... enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, UIImage *img, BOOL *stop) { ....

  3. 13

    Si necesita mutar el diccionario mientras se enumeran:

    for (NSString* key in xyz.allKeys) {
        [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
    }
    • La razón es allKeys devuelve una copia de las llaves. Así que es seguro para mutar el diccionario.
  4. 4

    La manera más fácil enumerar un diccionario es

    for (NSString *key in tDictionary.keyEnumerator) 
    {
        //do something here;
    }

    donde tDictionary es el NSDictionary o NSMutableDictionary desea recorrer.

  5. 2

    Rápida enumeración se añadió en 10.5 y en el iPhone OS, y es significativamente más rápido, no sólo azúcar sintáctico. Si usted tiene a destino el mayor tiempo de ejecución (es decir, 10.4 y hacia atrás), tendrás que utilizar el viejo método de la enumeración:

    NSDictionary *myDict = ... some keys and values ...
    NSEnumerator *keyEnum = [myDict keyEnumerator];
    id key;
    
    while ((key = [keyEnum nextObject]))
    {
        id value = [myDict objectForKey:key];
        ... do work with "value" ...
    }

    No liberan el objeto enumerador, y no se puede restablecer. Si desea empezar de nuevo, tienes que pedir un nuevo objeto enumerador del diccionario.

  6. 1

    Puede utilizar -[NSDictionary allKeys] para tener acceso a todas las teclas y bucle a través de él.

    • Cierto, pero esto crea un extra de autoreleased matriz, que puede ser bastante ruinoso, especialmente para los diccionarios con un montón de llaves.

Dejar respuesta

Please enter your comment!
Please enter your name here