2009-10-14 15 views
18

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 el nombre de la clave.¿Usar valueForKeyPath en NSDictionary si una tecla inicia el símbolo @?

estoy teniendo problemas tratando de crear la ruta de la clave como yo estoy haciendo una excepción de formato, incluso cuando se trata de escapar el símbolo @:

Esto funciona bien:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"] 

Sin embargo, ninguno de estos trabajos:

[dict valueForKeyPath:@"[email protected]"] 
[dict valueForKeyPath:@"[email protected]@specialKey.key3"] 

¿Alguna idea?

Gracias,

Mike

+0

Así que, básicamente, su dict objectForKey: @ "key1" es una NSDictionaryObject también. Y ese dict objectForKey: @ "key3" –

Respuesta

19

no se debe utilizar @ carteles con los nombres de claves si desea utilizar la codificación de valores clave.

apple's guidelines para los nombres clave son los siguientes:

teclas deben de utilizar la codificación ASCII, comenzará con una letra minúscula, y no puede contener espacios en blanco .

Tendrás que encontrar una solución alternativa para volver a formatear la cadena de teclas donde estés obteniendo las claves para que sean compatibles con KVC.

+0

¡Ah está bien entonces! Pensé que era necesario que ocurriera algún tipo de escape, pero pensándolo bien, por supuesto, algo que empiece con @ no puede ser compatible con KVC. ¡Aclamaciones! –

+1

np. también le ahorrará muchos dolores de cabeza cuando use otras clases y tecnologías que usan KVC, como datos básicos. – pxl

1

Si no tiene control sobre la denominación, ¿qué tal si agrega una categoría con una clave con el nombre adecuado que simplemente devuelve/establece la clave extraña?

+0

esa es una buena idea. pero dado lo que se supone que debe hacer KVC, no veo cómo eso sea siquiera necesario. KVC es una especie de práctica para hacer que los buscadores y establecedores de nombres sean consistentes para que pueda acceder a las propiedades. por lo tanto, si no puede nombrar una propiedad con un signo @, nunca debe entrar en una situación en la que sea parte de un keypath. – pxl

13

Sólo para actualizar esta vieja pregunta un poco ...

La razón de que éstos:

[dict valueForKeyPath:@"[email protected]"] 
[dict valueForKeyPath:@"[email protected]@specialKey.key3"] 

... fallar es que cualquier símbolo "@" en una ruta de la clave se interpretan como collection's operators como con:

[dict valueForKeyPath:@"[email protected]"] // returns the sum of all 'key3' values 
[dict valueForKeyPath:@"[email protected]"] // returns the average of all 'key3' values 

Las llamadas anidadas clave:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"] 

... funciona porque una sola clave no se procesa como una ruta clave.

+0

¡Gracias! ¡¡¡Funcionó!!! –

0

veo que hay 2 maneras

Swizzle

Puede SWIZZLE la valueForKeyPath en NSDictionary para eliminar el símbolo @, recuerde que debe dar cuenta de @Sum, @average, ...

de anulación si está usando Manto

Anulación + (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary en MTLJSONAdapter, atravesar todas las llaves y eliminar el símbolo @

Cuestiones relacionadas