2010-09-17 5 views
0

J'ai un NSDictionary dans lequel j'utilise mes propres classes (sous-classes NSObject) comme clés et je voudrais m'assurer que je n'inclue pas deux fois la même clé. Cependant, parce que NSDictionary copie ses clés, si j'essaie de vérifier si un objet est dans le dictionnaire, il ne le pense jamais. Par exemple,Clés uniques dans NSDictionary - comment vérifier les clés données sont des copies?

MyClass* obj = [[MyClass alloc] init]; 
NSMutableDictionary* dict = [NSMutableDictionary dictionary]; 
[dict setObject:someObj forKey:obj]; 
if ([[dict allKeys] contains:obj]) // always returns false 
    // obj is already in dict 
else 
    // add obj to dict etc. 

De même, si je veux changer l'objet associé à cette clé, il semble créer une nouvelle entrée.

// dict is empty 
// say [obj description] gives 'MyClass : 0x1' - (impossible address?) 
[dict setObject:someObj forKey:obj]; 
// dict: { 'MyClass : 0x2' = someObjDesc } 
[dict setObject:someOtherObj forKey:obj]; 
// dict: { 'MyClass : 0x2' = someObjDesc , 'MyClass : 0x3' = someOtherObjDesc } 

En outre, cette même chose conduit à ne pas pouvoir accéder aux éléments dans le dictionnaire de l'objet d'origine

[dict setObject:someObj forKey:obj]; 
[dict objectForKey:obj]; // returns null 

Ainsi, dans la mesure où le caractère unique concerne, je serais mieux loti garder une trace des clés dans un tableau séparé ou y a-t-il une meilleure façon de le faire. J'ai envisagé de mettre en œuvre une méthode isEqual basée sur une variable unique (comme un nom) mais je ne pensais pas que c'était la bonne chose à faire.

Contexte (dans le cas où il se trouve que je n'utilise que la mauvaise chose): Je veux garder une trace d'informations sur un groupe de personnes allant à différents endroits. Donc, chaque personne à chaque endroit a des informations. Ce que j'ai fait est utilisé des dictionnaires imbriqués de sorte que la clé du dictionnaire principal est un objet Personne et l'objet un autre dictionnaire. Ce dernier dictionnaire a la clé Place et info comme objet. Je pense que c'est une syntaxe Java mais quelque chose comme> (le tableau contient l'information). Je veux être en mesure d'ajouter une personne seulement si elle n'existe pas, ajouter un lieu (pour chaque personne), changer le tableau.

Une aide sur tout cela serait grandement appréciée!

Répondre

0

Vous devez toujours utiliser NSStrings comme clés pour les dictionnaires, en particulier si vous êtes nouveau dans l'objectif-C. Il y a certaines choses que je peux voir que vous faites mal avec votre mise en œuvre actuelle - vous auriez besoin de lire sur les exigences clés pour NSDictionaries.

Vous pouvez faire ce que vous voulez avec des chaînes comme clés - nom de la personne, etc.

Les objets dans un dictionnaire ont toutes les informations sur une certaine personne:

NSDictionary* personsInfo = [mainDict objectForKey:@"Jane Smith"]; 

NSString* addressLine1 = [personsInfo [email protected]"addressLine1"]; 

--Tom

+0

Je pensais que était la différence entre une clé et une valeur (_should_ j'utilise des valeurs plutôt,?). Diriez-vous que l'utilisation des noms en tant que clés/valeurs, puis avoir des dictionnaires séparés mappant les noms sur les objets serait une meilleure mise en œuvre? Merci d'avoir pris le temps de répondre. – mmdeas

+0

Juste réalisé que c'est toujours une clé et que c'était des objets et des valeurs dont il y avait deux ... Il suffit de lire les fondamentaux de codage de valeur-clé pour comprendre la différence ... – mmdeas

+0

Je pense que j'ai réussi à re-concevoir mes structures de données en fonction de ce que vous avez dit et de ce que cela m'a incité à lire. Merci. – mmdeas

0

La réponse simple serait de faire en sorte que le MyClass ne copie réellement rien.

Ce serait quelque chose comme changer:

- (id) copyWithZone:(NSZone *)zone { 
    MyClass * foo = (MyClass *)[super copyWithZone:zone]; 
    [foo configureCopy]; 
    return foo; 
} 

Pour:

- (id) copyWithZone:(NSZone *)zone { 
    return [self retain]; 
} 
+0

Ah. Même après avoir écrit le code qui a créé le nouvel objet comme une copie, je n'avais pas considéré cela. Cela pourrait-il devenir problématique si l'objet était mutable? – mmdeas

+0

Merci pour cette réponse car elle a relié ces parties séparées dans mon esprit et m'a aidé à mieux comprendre le processus global qui, je suis sûr, sera utile à l'avenir. – mmdeas

Questions connexes