Mutación KVC DRY de iOS

Estoy tratando de asignar un diccionario de cadenas desde una búsqueda de JSON a un NSManagedObject compatible con KVC, puedo usar setValue: forKey: pero no veo cómo puedo mapear tipos.

Por ejemplo, no debería poder establecer una fecha para ninguna cadena aleatoria: Imprimir descripción de myDate: asdfsadf sin embargo funcionó.

Eché un vistazo a https://stackoverflow.com/a/5345023/828859 que proporcionó algunas respuestas útiles. Puedo entrar y crear una validación para cada propiedad ... pero eso no parece muy SECO porque tengo que validar cada fecha y establecer el valor por separado cada vez que tengo una fecha.

Preferiría mutar por tipo antes de usar setValue: forKey: pero no sé cómo discriminar en el tipo de propiedad.

Lo que quiero hacer:

switch([object typeforkey:key]){
   case @"NSDate":
   //...
   value = mutatedDate
   //...
}
[object setValue:value forKey:key];
0

2 Respuestas

Terminé usando otro diccionario para el mapeo del tipo de propiedad. A continuación, un objeto de mapeo de objetos verifica que el objeto sea compatible con el mapa por este protocolo en particular y utiliza el diccionario de tipo de propiedad para convertir cada propiedad antes de usar setValue: forKey: .

0
agregado

Puede preguntarle a un objeto en qué tipo de clase se ha instanciado. Entonces puedes hacer algo como:

id myObject = [myDictionary objectForKey:key];

if ([myObject isKindOfClass:[NSDate class]]) {
   //Do stuff
}
else if ([myObject isKindOfClass:[NSString class]]) {
   //Do other stuff
}

Esto se debe a que los objetos son estructuras que contienen un puntero con el nombre ivar isa apuntando a un objeto de tipo Clase , por lo que siempre se puede preguntar a un objeto de qué clase proviene .

0
agregado
Es cierto, sin embargo, no estaba claro en mi pregunta, el diccionario proviene de una respuesta JSON, por lo que es un diccionario de cadenas.
agregado el autor MrJD, fuente
Ah, ya veo. No creo que haya una manera limpia de hacer lo que quieras. Usted necesita saber cuáles son las claves por adelantado y sus tipos y cambiar su tipo de objeto en función de eso o necesita hacer un montón de escaneo de cadenas para descubrir con qué está trabajando y luego la validación.
agregado el autor Jack Lawrence, fuente