2012-05-14 3 views
18

Dans mon application, j'ai une classe Person avec la propriété personId.
Maintenant je besoin une structure de données pour contenir un tas d'objets Person unique (personId unique, = différent)Objectif c - Propriété d'objet unique NSMutableSet

Je suppose que je devrais utiliser NSMutableSet comme ma structure de données, mais comment puis-je faire la NSMutableSet comparer la propriété personId lorsque ajouter une personne (donc je n'ajouterai pas la même personne plus d'une personne)?

Mon but est d'avoir une collection de personnes uniques tout le temps (même si j'ajoute deux personnes avec le même identifiant), je veux que NSMutableSet fasse tout le travail dur pour moi et si j'ajoute un personne qui existe déjà ne l'ajoutera pas deux fois.

Répondre

32

Vous pouvez réaliser cela en comprenant comment la comparaison est effectuée par le NSSet. Lorsque vous ajoutez un nouvel objet à l'ensemble, la méthode isEqual: est appelée (méthode NSObject) pour chacun des éléments de l'ensemble. Donc ce que vous pouvez faire est remplacer cette méthode et de fournir une comparaison personnalisée comme ceci:

REMARQUE:

Si vous substituez isEqual: méthode doit override hash méthode et

// In your Person.m 
- (BOOL)isEqual:(id)anObject 
{ 
    return [self.personId isEqual:anObject.personId]; 
    // If it's an object. Otherwise use a simple comparison like self.personId == anObject.personId 
} 

- (NSUInteger)hash 
{ 
    return self.personId; //Must be a unique unsigned integer 
} 
+0

merci c'est ce que je cherchais :) – Eyal

+0

juste une chose, si mon personId est NSString, comment devrais-je remplacer la méthode de hachage? – Eyal

+1

Jetez-le juste à un int comme ceci: '[self.personId intValue]'. Et pour votre comparaison utilisez: '[self.personId isEqualToString: anObject.personId]' – Alladinian

0

Vous ne devriez pas avoir à vous soucier de cela lorsque vous ajoutez des éléments à une matrice. Tant que vous ajoutez un objet unique à chaque fois, les propriétés de l'objet ne doivent pas avoir d'importance.

Si vous êtes inquiet à ce sujet et que vous voulez être doublement sûr, utilisez NSMutableSet à la place (sauf si vous avez besoin de maintenir l'ordre de chaque objet).

Mise à jour

Vous pouvez utiliser un prédicat pour vérifier qu'un objet avec la même valeur n'existe pas avant de l'ajouter. Cela fonctionnerait correctement avec NSMutableArray et NSMutableSet.

//create array 
NSMutableArray *array = [[NSMutableArray alloc] init]; 

//create person 
Person *newPerson = [[Person alloc] init]; 

//add person 
[array addObject:newPerson] 

//check new object exists 
if([[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"personID == %@", [newPerson personID]]] count] == 0) 
{ 
    //add object 
    [array addObject:newPerson]; 
} 

pseudocode très rude, mais nous espérons que vous obtenez l'essentiel :)

+0

Mon Le but est d'avoir une collection de personnes uniques tout le temps (même si j'ajoute deux personnes avec le même identifiant), je veux que le NSMableSet fasse le travail dur pour moi et si j'ajoute une personne qui existe déjà il a gagné ne l'ajoutez pas deux fois .. – Eyal

+0

Vous pouvez utiliser un prédicat pour vérifier si un objet existe déjà avec la même valeur - voir mes modifications. – CaptainRedmuff

+0

NSMutableSet ne vérifie pas automatiquement l'ID de la personne. Il considèrera que deux objets ne sont identiques que s'ils pointent tous les deux vers les mêmes objets exacts. Vous êtes mieux avec le dictionnaire comme indiqué ci-dessous. Il fera le remplacement des ID de personne identiques pour vous. –

4

Je pense que ce que vous voulez est un NSMutableDictionary, la cartographie de la personId à l'objet Person.

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 

Person *person = something; 
[dict setObject:personObj forKey:[NSNumber numberWithInt:[person personId]]]; 
... etc ... 

(ne pas oublier de publier dict plus tard quelque part).

Afin de trouver la classe Person pour la spécifiée personId (12, par exemple), vous pouvez simplement faire:

Person *person = [dict objectForKey:[NSNumber numberWithInt:12]]; 

Note: que vous devez stocker la clé et la valeur sous forme d'objets (vous ne peut pas stocker les types primitifs).

+0

s'il vous plaît regardez, j'ai expliqué plus dans ma question – Eyal

+1

@Eyal Je pense que ma réponse fera ce que vous voulez; Si vous ajoutez un autre objet avec le même 'personId', l'ancien objet' Person' sera remplacé. – trojanfoe