2008-12-19 5 views
3

j'ai un objet de variables d'instance simple. Certains sont NSString, certains sont ints non signés, etc. J'avais l'impression Valeur clé de codage est scriptable dans ce que je pouvais écrire un code tel que le suivant:codage valeur clé et sa capacité de script

id key, value; 
    key  = [[attributes objectAtIndex:j] name]; 
    value = [[attributes objectAtIndex:j] stringValue]; 
    [obj setValue:value forKey:key]; 

La raison pour laquelle je suis ici en utilisant stringValue et nom Je travaille avec TouchXML et je construis des objets à partir de flux XML.

Le code ci-dessus se bloque si je tente d'attribuer quoi que ce soit à un nombre entier. Si je change mon int non signé en une instance de NSString, il n'y a pas de crash au moment de l'exécution. Je crois comprendre que le codage Key-Value est assez intelligent pour détecter ces problèmes.

Quelles sont les solutions possibles? Comment puis-je abstraite cela autant que possible, je peux exécuter la même méthode sur de nombreuses classes différentes qui ont toutes leurs propres variables d'instance?

est la méthode la plus élégante pour remplacer vraiment mon setter et utiliser NSNumber pour convertir la chaîne en un type int, que je pensais était déjà traitée par KVC?

Répondre

3

KVC ne fait pas de coercition de type/traduction en interne, de sorte que le type de l'objet que vous passez dans setValue:forKey: doit correspondre au type de la variable d'instance, il sera stocké dans. Types autochtones tels que int, long, etc. sont empaquetés dans NSNumber objets, et des choses comme les structures sont emballés dans NSValue objets. Pour définir une valeur déclarée en tant que type natif, vous devez passer un objet wrapper approprié pour l'argument value.

je recommande également de faire toute traduction requise dans le code qui vous appelle le poseur, et non dans le compositeur lui-même. C'est plus une question d'opinion, donc je suppose que vous pourriez traduire des choses dans le setter si vous le voulez vraiment. Ma version de votre code ressemblerait à quelque chose comme:

id key, value; 
key = [[attributes objectAtIndex:j] name]; 
value = [NSNumber numberWithInt:[[[attributes objectAtIndex:j] stringValue] intValue]]; 
[obj setValue:value forKey:key]; 
Questions connexes