Pregunta

Tengo un objeto NSDictionary que está poblada por NSMutableStrings para sus llaves y objetos. He sido capaz de cambiar la clave cambiando la NSMutableString original con el setString: método. La clave, sin embargo sigue siendo el mismo, independientemente de los contenidos de la cadena que se utiliza para establecer la clave al principio.

Mi pregunta es, es la clave protegido de ser cambiado lo que significa que siempre será la misma a menos que lo quito y añadir otra al diccionario?

Gracias.

¿Fue útil?

Solución

Las teclas están -copy'd cuando están establecidos los elementos, por lo que no puede cambiarlo después es inútil.

Los métodos que añadir entradas a los diccionarios, ya sea como parte de la inicialización (para todos los diccionarios) o durante la modificación (para los diccionarios mutables) -copiar cada argumento clave (teclas deben cumplir con el protocolo NSCopying) y añadir las copias al diccionario. Cada objeto de valor que corresponde recibe un mensaje de retener para asegurarse de que no se cancela la asignación antes de que el diccionario es a través de la misma.

Se podría utilizar CFDictionary con kCFTypeDictionaryKeyCallBacks, o simplemente reemplazar el artículo:

id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];

Otros consejos

Trate de usar NSMutableDictionary, en su lugar.

Se puede crear una copia del diccionario, el filtrado de las teclas a medida que avanza. Hago esto para la conversión entre camello caso y subrayados cuando poblar objetos de JSON usando KVC. Ver mi biblioteca de refactorización, es_ios_utils , para la fuente. ESNSCategories.h proporciona:

@interface NSMutableDictionary(ESUtils)
    //Changes keys using keyFilter. If keyFilter generates duplicate non-unique keys, objects will be overwritten.
    -(void)addEntriesFromDictionary:(NSDictionary*)d withKeyFilter:(NSString*(^)(NSString*))keyFilter;
...

Así que para hacer todas las teclas mayúsculas, usted podría hacer algo como:

NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:oldDictionary.count];
[md addEntriesFromDictionary:oldDictionary
               withKeyFilter:^NSString*(NSString *key) { 
                                 return key.uppercaseString;
                             }];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top