Question

J'essaie d'écrire une bibliothèque de manière à ce qu'elle soit suffisamment générique pour être utile. Le problème est qu’il doit mettre à jour les propriétés d’autres classes. La propriété et la classe doivent être dynamiques.

Maintenant, je peux le faire en utilisant des variables publiques sans problème, je passe juste un pointeur sur la variable que je veux mettre à jour. Cependant, il serait également extrêmement utile de définir les propriétés des classes, car elles sont utilisées de manière aussi libérale dans l’objectif C.

Là encore, le problème ne se pose pas tant que la propriété est un type d'objet et tente de définir des propriétés de type primitif.

Mon code actuel ressemble à quelque chose de particulier aux propriétés suivantes:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[[myInstance class] instanceMethodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
[invoc setArgument:&myObject atIndex:2];
[invoc invoke];

Cependant, la méthode setArgument n'autorise que les types de pointeur, mais les propriétés sont autorisées à avoir n'importe quel type primitif. Existe-t-il un moyen d’attribuer dynamiquement des propriétés de type primitif?

Était-ce utile?

La solution

KVO devrait effectuer la conversion pour vous:

[object setValue:[NSNumber numberWithInt:i] forKey:@"myVar"];

convertira le NSNumber en un entier si votre myVar est défini comme suit:

int myVar;
...
@propery (nonatomic) int myVar;

Autres conseils

"Cependant, la méthode setArgument ne permet que les types de pointeur" Vous manquez quelque chose. L'argument de setArgument: n'est pas la donnée que vous transmettez à la méthode. C'est l'adresse des données (de type quel que soit ) que vous transmettez. Actuellement, votre code ci-dessus prend l'adresse d'un pointeur d'objet (c'est un pointeur vers un pointeur). Vous pouvez tout aussi facilement lui faire prendre l'adresse d'un entier (peu importe). En d'autres termes, votre même code exact fonctionne déjà quel que soit le type:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top