definição do tipo primitivo propriedade dinâmica em Objective C
-
06-07-2019 - |
Pergunta
Eu estou tentando escrever uma biblioteca de modo que é bastante genérico que a sua utilidade. O problema é que ele precisa para propriedades de atualização de outras classes, tanto a propriedade e classe deve ser dinâmico.
Agora eu posso fazê-lo usando variáveis ??públicas não há problema, eu só passar um ponteiro para a variável que deseja atualizar. No entanto, também seria extremamente útil para propriedades conjunto de classes, bem como, uma vez que eles são usados ??tão liberalmente em C objetivo.
Agora, novamente este não é um problema, desde que a propriedade é um tipo de objeto, tentando definir as propriedades de tipo primitivo.
Meu código atual é algo ao longo destas linhas para propriedades:
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[[myInstance class] instanceMethodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
[invoc setArgument:&myObject atIndex:2];
[invoc invoke];
No entanto, o método permite setArgument apenas para tipos de ponteiro, ainda propriedades estão autorizados a ter qualquer tipo primitivo. Existe alguma maneira de atribuir dinamicamente as propriedades de tipo primitivo?
Solução
KVO deve fazer a conversão para você:
[object setValue:[NSNumber numberWithInt:i] forKey:@"myVar"];
irá converter o NSNumber
para um int se o seu myVar
é definido como:
int myVar;
...
@propery (nonatomic) int myVar;
Outras dicas
"No entanto, o método setArgument permite apenas para tipos de ponteiro" Você está faltando alguma coisa. O argumento para setArgument:
não é os dados que você está passando para o método. É o endereço dos dados (de qualquer que seja tipo) que você está passando. Agora o seu código acima assume o endereço de um ponteiro de objeto (que é um ponteiro para um ponteiro). Você pode facilmente torná-lo tomar o endereço de um inteiro (não importa). Em outras palavras, o mesmo código exato já funciona independentemente do tipo:
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];