mutação iOS KVC DRY

Eu estou tentando mapear um dicionário de seqüências de caracteres de uma busca JSON para um NSManagedObject compatível com KVC, eu posso usar com êxito setValue: forKey: mas eu não consigo ver como eu posso mapear tipos.

Por exemplo, eu não deveria ser capaz de definir uma data para qualquer string aleatória: Imprimindo a descrição de myDate: asdfsadf no entanto, funcionou.

Eu dei uma olhada em https://stackoverflow.com/a/5345023/828859 que forneceu algumas respostas úteis. Eu posso entrar e criar validação para cada propriedade ... mas isso não parece muito seco, porque eu tenho que validar cada data e definir o valor de saída separadamente cada vez que eu tenho uma data.

Eu preferiria alterar por tipo antes de usar setValue: forKey: mas não sei discriminar o tipo de propriedade.

O que eu quero fazer:

switch([object typeforkey:key]){
   case @"NSDate":
   //...
   value = mutatedDate
   //...
}
[object setValue:value forKey:key];
0
adicionado editado
Visualizações: 1

2 Respostas

Acabei usando outro dicionário para mapeamento de tipo de propriedade. Em seguida, um objeto de mapeamento de objetos verifica o objeto a ser mapeado por este protocolo específico e usa o dicionário do tipo de propriedade para converter cada propriedade antes de usar setValue: forKey: .

0
adicionado

Você pode perguntar a um objeto que tipo de classe foi instanciado. Então você pode fazer algo como:

id myObject = [myDictionary objectForKey:key];

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

Isto é porque os objetos são structs contendo um ponteiro com o nome ivar isa apontando para um objeto do tipo Class , então você sempre pode perguntar a um objeto que tipo de classe ele vem .

0
adicionado
É verdade, no entanto, eu não estava claro na minha pergunta, o dicionário vem de uma resposta JSON, então é um dicionário de strings.
adicionado o autor MrJD, fonte
Ah, entendo. Eu não acho que haja uma maneira limpa de fazer o que você quer. Você precisa saber quais são as chaves antecipadas e seus tipos e alternar seu tipo de objeto com base nisso ou você precisa fazer um monte de escaneamento de strings para descobrir com o que você está trabalhando e depois com a validação.
adicionado o autor Jack Lawrence, fonte