2010-03-10 2 views
10

Cocoa fornisce NSDictionary, che essenzialmente è un array associativo.Mappa bidirezionale in cacao

C'è un buon modo per ottenere l'associatività bidirezionale? Ad esempio, un modo sarebbe stato se NSDictionary avesse un metodo keyForObject: che rispecchiava il comportamento di objectForKey:.

Non mi interessa davvero se NSDictionary non è il modo per ottenere questo. So che NSDictionary fa fornisce keysOfEntriesPassingTest: ma restituisce un NSSet * che non sembra molto pulito per il tipo di cosa che voglio avere.

Ecco un esempio:

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

voglio tradurre tra c0 e synckey e ritorno, e idem per gli altri campi.

risposta

10

La cosa più vicina a ciò che cercate è, credo, allKeysForObject:. Questo restituisce un NSArray contenente le chiavi corrispondenti a tutte le occorrenze di un dato oggetto nel dizionario. Ovviamente se l'oggetto è nel dizionario una sola volta, il NSArray conterrà solo un oggetto.

Quindi, con il tuo esempio:

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

Questo codice aggiuntivo restituirebbe una matrice contenente 1 oggetto stringa valutare a @ "C7":

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

[A parte: Si noti che questo sarebbe solo lavoro qui a causa di come funziona il compilatore; prende tutte le occorrenze di @ "wi_prio" e le rende lo stesso oggetto. Se invece tu avessi forse caricato il dizionario dal disco ecc, questo approccio non funzionerebbe per NSStrings. Invece dovresti probabilmente usare allKeys e poi iterare attraverso di loro, confrontando con [mystring isEqualToString:anotherString].]