iphone - ¿Utilizando valueForKeyPath en NSDictionary si una tecla inicia el símbolo @?
objective-c key-value-coding (4)
Quiero usar valueForKeyPath
en mi NSDictionary
, pero el problema es que una de las claves es una cadena que comienza con el símbolo @. No tengo control sobre la denominación de la clave.
Tengo problemas al intentar crear la ruta de acceso clave porque obtengo una excepción de formato, incluso cuando intento escapar del símbolo @:
Esto funciona bien:
[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]
Sin embargo ninguno de estos trabajos:
[dict valueForKeyPath:@"[email protected]"]
[dict valueForKeyPath:@"key1.@@specialKey.key3"]
¿Algunas ideas?
Gracias,
Micro
Si no tiene control sobre la denominación, ¿qué le parece agregar una categoría con una clave con el nombre correcto que simplemente devuelve / establece la clave extraña?
Solo para actualizar un poco esta vieja pregunta ...
La razón por la que estos:
[dict valueForKeyPath:@"[email protected]"]
[dict valueForKeyPath:@"key1.@@specialKey.key3"]
... falla es que cualquier símbolo "@" en una ruta de acceso clave se interpreta como operadores de colección como:
[dict valueForKeyPath:@"[email protected]"] // returns the sum of all ''key3'' values
[dict valueForKeyPath:@"[email protected]"] // returns the average of all ''key3'' values
Las llamadas clave anidadas:
[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]
... funciona porque una sola clave no se procesa como una ruta de acceso de clave.
Veo que hay 2 formas.
Swizzle
Puede valueForKeyPath
el valueForKeyPath
en NSDictionary
para eliminar el símbolo @, recuerde tener en cuenta @sum, @average, ...
Anular si estás usando Mantle
Override + (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary
en MTLJSONAdapter
, atraviesa todas las claves y elimina el símbolo @
no debe utilizar signos @ con sus nombres de clave si desea utilizar la codificación de valores clave.
Las pautas de Apple para los nombres clave son las siguientes:
Las claves deben usar la codificación ASCII, comenzar con una letra minúscula y es posible que no contengan espacios en blanco.
Tendrá que encontrar una solución alternativa para reformatear la cadena de claves de donde sea que obtenga sus claves para que sean compatibles con KVC.