37 votes

Utilisation de la classe en tant que clé dans NSDictionary

Je suis en train d'écrire un contexte "d'usine" qui permettra de maintenir un dictionnaire de convertisseur/agissant des objets qui héritent de certains Convertisseur de classe. Cette classe possède une méthode:

- (Class)classResponsibility

Ou quelque chose de similaire, tel qu'un StringConverter classe serait de mettre en œuvre la méthode:

- (Class)classResponsibility {
    return [NSString class];
}

Ensuite à stocker que le convertisseur dans le dictionnaire, j'avais espéré quelque chose comme:

[converters setValue:stringConverter forKey:[stringConverter classResponsibility]];

Mais le compilateur se plaint de ce que le type "Classe" est un type de paramètre non valide pour l'argument 2 de la setValue:forKey: la méthode. Je voulais éviter de mettre la clé sous le nom de la Classe ("NSString"), mais si c'est la meilleure solution que je vais aller avec elle.

99voto

Skirwan Points 1064

Vous êtes à l'aide de setValue:forKey: qui ne prend NSStrings comme des clés. vous devriez être en utilisant setObject:forKey: à la place. Un objet de classe (des pointeurs vers des objets de la classe peut être passé comme type Class) est un acteur à part entière Objective-C objet (un objet de classe est une instance de sa méta-classe, et vous pouvez utiliser tous les NSObject méthodes sur un objet de classe; en lire plus sur les méta-classes ici), de sorte qu'ils peuvent être utilisés partout où des objets sont utilisés.

Une autre exigence pour les clés d'un dictionnaire est qu'ils sont favorables à la reproduction (c'est à dire l' copyWithZone: méthode. Faire des objets de la classe en charge cette méthode? En fait, il n'. Le NSObject classe définit une méthode de la classe +copyWithZone:, dont la documentation dit explicitement qu'il "permet d'utiliser un objet de classe comme une clé pour un NSDictionary objet". Je pense que c'est la réponse à votre question.

30voto

Sean Points 31

Votre autre option est d'utiliser [NSValue valueWithNonretainedObject:yourObjectHere] à la construction de la clé à partir d'autre chose qu'une chaîne de caractères. J'ai rencontré un problème similaire et j'ai voulu utiliser un CoreData objet comme la clé et quelque chose d'autre que de la valeur. Cette NSValue méthode a fonctionné parfaitement et je crois que c'est l'intention initiale. Pour revenir à la valeur initiale, juste appelez - nonretainedObjectValue

3voto

Craig Otis Points 5399

J'ai été à la recherche pour le setObject:forKey: méthode au lieu de setValue:forKey:. La signature de la méthode pour setObject:forKey: accepte (id) que les deux types de paramètres, et est beaucoup mieux adapté.

3voto

Tom M Points 121

Alors qu'un objet de Classe fait une très bonne clé dans un NSDictionary, il est important de mentionner NSMapTable, qui est calquée sur NSDictionary, mais offre plus de souplesse quant à ce type d'objets sont adaptés pour une utilisation en tant que clés et/ou de valeurs, documentées à l'appui de références faibles et arbitraire des pointeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X