2010-03-10 13 views
10

Kakao dostarcza NSDictionary, który zasadniczo jest tablicą asocjacyjną.Dwukierunkowa mapa w kakao

Czy istnieje dobry sposób na uzyskanie dwukierunkowej asocjatywności? tj. jeden sposób byłby, gdyby NSDictionary miał metodę keyForObject:, która odzwierciedlała zachowanie objectForKey:.

Nie obchodzi mnie, czy NSDictionary nie jest sposobem na uzyskanie tego. Wiem, że NSDictionary ma dostarczać keysOfEntriesPassingTest:, ale zwraca NSSet *, który nie wygląda bardzo czyste dla tego rodzaju rzeczy, które chcę mieć.

Oto przykład:

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

chcę tłumaczyć między c0 i synckey iz powrotem, a samo dotyczy innych dziedzin.

Odpowiedz

10

Najbardziej zbliżoną rzeczą do tego, o co nam chodzi, uważam, allKeysForObject:. Zwraca NSArray zawierający klucze odpowiadające wszystkim wystąpieniom danego obiektu w słowniku. Oczywiście, jeśli obiekt znajduje się w słowniku tylko raz, NSArray będzie zawierał tylko jeden obiekt.

Więc z Twojego przykładu:

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

Ten dodatkowy kod będzie zwracać tablicę zawierającą 1 ciąg obiektu oceniający do @ "C7":

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

[Na marginesie: Zauważ, że to będzie tylko praca tutaj z powodu działania kompilatora; zajmuje wszystkie wystąpienia @ "wi_prio" i czyni je tym samym obiektem. Jeśli zamiast tego prawdopodobnie załadowałeś słownik z dysku itp., To podejście nie zadziała dla NSStrings. Zamiast tego prawdopodobnie powinieneś użyć allKeys, a następnie przejrzeć je, porównując z [mystring isEqualToString:anotherString].]