2012-05-14 9 views
18

In meiner App habe ich eine Klasse Person mit personId Eigenschaft.
Jetzt brauche ich einige Datenstruktur eine Reihe von einzigartigen Person Objekte (unique = verschiedene PersonId)Objective c - NSMutableSet eindeutige Objekteigenschaft

Also sollte ich denke, halten ich NSMutableSet als meine Datenstruktur verwenden, aber wie mache ich das NSMutableSet die personId Eigenschaft vergleichen, wenn Hinzufügen einer Person (also werde ich nicht die gleiche Person mehr als diejenigen hinzufügen)?

Mein Ziel ist es, eine Sammlung von einzigartigen Personen die ganze Zeit (auch wenn ich zwei Personen mit der gleichen ID hinzufügen), möchte ich, dass die NSMutableSet wird die ganze harte Arbeit für mich tun, und wenn ich ein hinzufügen Person, die bereits existiert, wird sie nicht zweimal hinzufügen.

Antwort

32

Sie können dies erreichen, indem Sie verstehen, wie der Vergleich von der NSSet gemacht wird. Wenn Sie dem Satz ein neues Objekt hinzufügen, wird die isEqual:-Methode für jedes der Elemente des Satzes aufgerufen (es handelt sich um eine NSObject-Methode). Also, was Sie tun können, ist diese Methode überschreiben und einen benutzerdefinierten Vergleich wie folgt liefern:

HINWEIS:

Wenn Sie außer Kraft setzen isEqual: Methode Sie muss Überschreibung hash Methode als auch

// 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

danke das ist, was ich gesucht habe :) – Eyal

+0

nur eine Sache, wenn meine PersonId NSString ist, wie sollte ich die Hash-Methode überschreiben? – Eyal

+1

Wirf es einfach auf ein int wie folgt: '[self.personId intValue]'. Und für Ihren Vergleich verwenden Sie: '[self.personId isEqualToString: anObject.personId]' – Alladinian

0

Sie müssen sich keine Gedanken darüber machen, wenn Sie einem Array Objekte hinzufügen. Solange Sie jedes Mal ein eindeutiges Objekt hinzufügen, sollten die Eigenschaften des Objekts keine Rolle spielen.

Wenn Sie sich darüber Sorgen machen und doppelt sicher sein möchten, verwenden Sie stattdessen NSMutableSet (es sei denn, Sie müssen die Reihenfolge der einzelnen Objekte beibehalten).

aktualisiert

Sie ein Prädikat verwenden könnte ein Objekt mit dem gleichen Wert zu überprüfen, ob nicht vor existiert es hinzugefügt wird. Dies würde sowohl mit NSMutableArray als auch mit NSMutableSet funktionieren.

//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]; 
} 

Sehr grobe Pseudo-Code, aber hoffentlich bekommen Sie den Kern :)

+0

Meine Ziel ist es, eine Sammlung von einzigartigen Personen die ganze Zeit (auch wenn ich zwei Personen mit der gleichen ID hinzufügen), möchte ich, dass die NSMutableSet die harte Arbeit für mich tun wird und wenn ich eine Person hinzufügen, die bereits existiert gewann füge es nicht zweimal hinzu. – Eyal

+0

Sie können ein Prädikat verwenden, um zu prüfen, ob ein Objekt bereits mit dem gleichen Wert existiert - siehe meine Änderungen. – CaptainRedmuff

+0

NSMutableSet überprüft die Personen-ID nicht automatisch. Es wird in Betracht gezogen, dass zwei Objekte nur dann identisch sind, wenn sie tatsächlich auf genau dieselben Objekte zeigen. Sie sind besser dran mit dem Wörterbuch wie unten angegeben. Es wird die Ersetzung von identischen PersonIDs für Sie tun. –

4

Ich denke, was Sie wollen, ist ein NSMutableDictionary, Abbilden der personId zum Person Objekt.

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

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

(vergessen Sie nicht, dict später irgendwo zu veröffentlichen).

Um die Person Klasse für den angegebenen personId (12, sagen) zu finden, können Sie einfach tun:

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

Hinweis: dass Sie sowohl den Schlüssel und den Wert als Objekte zu speichern haben (Sie Primitive Typen können nicht gespeichert werden).

+0

bitte schau ich mehr in meiner Frage – Eyal

+1

@Eyal Ich denke, meine Antwort wird tun, was Sie wollen; Wenn Sie ein weiteres Objekt mit derselben PersonId hinzufügen, wird das alte Objekt Person ersetzt. – trojanfoe