2010-03-10 15 views
10

Cocoa stellt NSDictionary bereit, das im Wesentlichen ein assoziatives Array ist.Bidirektionale Karte in Cocoa

Gibt es eine gute Möglichkeit, bidirektionale Assoziativität zu erhalten? ein Weg wäre gewesen, wenn NSDictionary eine keyForObject:-Methode hätte, die das Verhalten von objectForKey: widerspiegelt.

Ich interessiere mich nicht wirklich, wenn NSDictionary nicht der Weg ist, das zu bekommen. Ich weiß, NSDictionary tut bieten keysOfEntriesPassingTest:, aber es gibt eine NSSet *, die nicht sehr sauber für die Art der Sache, die ich haben möchte aussehen. Hier

ein Beispiel:

fieldMap = [[NSDictionary alloc] initWithObjectsAndKeys: 
    @"c0",@"synckey", 
    @"c1",@"wi_id", 
    @"c2",@"wi_parent_id", 
    @"c3",@"wi_type", 
    @"c4",@"wi_rh_task", 
    @"c5",@"decision_key", 
    @"c6",@"wi_stat", 
    @"c7",@"wi_prio", 
    @"c8",@"wi_cd", 
    @"c9",@"wi_ct", 
    @"cb",@"wi_dh_stat", 
    @"cc",@"wi_user", 
    nil]; 

ich zwischen c0 und synckey und zurück, und dito für die anderen Felder übersetzen möchten.

Antwort

10

Das nächste was Sie suchen ist, glaube ich, allKeysForObject:. Dies gibt ein NSArray zurück, das die Schlüssel enthält, die allen Vorkommen eines gegebenen Objekts im Wörterbuch entsprechen. Wenn das Objekt nur einmal im Wörterbuch vorhanden ist, enthält das NSArray offensichtlich nur ein Objekt.

So mit Ihrem Beispiel:

fieldMap = [[NSDictionary alloc] initWithObjectsAndKeys: 
    @"c0",@"synckey", 
    @"c1",@"wi_id", 
    @"c2",@"wi_parent_id", 
    @"c3",@"wi_type", 
    @"c4",@"wi_rh_task", 
    @"c5",@"decision_key", 
    @"c6",@"wi_stat", 
    @"c7",@"wi_prio", 
    @"c8",@"wi_cd", 
    @"c9",@"wi_ct", 
    @"cb",@"wi_dh_stat", 
    @"cc",@"wi_user", 
    nil]; 

Dieser zusätzliche Code ein Array mit 1 String-Objekt Auswertung zu @ "c7" zurückkehren würde:

NSArray *keyArray = [fieldMap allKeysForObject:@"wi_prio"]; 

[Abgesehen: Beachten Sie, dass dies würde nur Arbeit hier wegen der Funktionsweise des Compilers; Es nimmt alle Vorkommen von @ "wi_prio" auf und macht sie zum selben Objekt. Wenn Sie stattdessen das Wörterbuch von der Festplatte usw. geladen haben, funktioniert dieser Ansatz nicht für NSStrings. Stattdessen sollten Sie wahrscheinlich allKeys verwenden und dann iterieren, im Vergleich zu [mystring isEqualToString:anotherString].]