2010-03-10 23 views
10

Cocoa proporciona NSDictionary, que esencialmente es una matriz asociativa.Mapa bidireccional en Cocoa

¿Existe una buena forma de obtener asociatividad bidireccional? es decir, una forma habría sido si NSDictionary tuviera un método keyForObject: que reflejara el comportamiento de objectForKey:.

Realmente no me importa si NSDictionary no es la manera de conseguir esto. Sé que NSDictionary does proporciona keysOfEntriesPassingTest: pero devuelve NSSet * que no parece muy limpio para el tipo de cosas que quiero tener.

Aquí se muestra un ejemplo:

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

quiero traducir entre C0 y SyncKey y la espalda, y lo mismo para los otros campos.

Respuesta

10

Lo más cercano a lo que buscas es, creo allKeysForObject:. Esto devuelve un NSArray que contiene las claves correspondientes a todas las ocurrencias de un objeto dado en el diccionario. Obviamente, si el objeto está en el diccionario solo una vez, el NSArray contendrá solo un objeto.

Así que con su ejemplo:

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

Este código adicional sería devolver una matriz que contiene 1 objeto de cadena evaluar a @ "c7":

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

[Aparte: Tenga en cuenta que esto sería sólo el trabajo aquí debido a cómo funciona el compilador; toma todas las ocurrencias de @ "wi_prio" y las convierte en el mismo objeto. Si, en cambio, usted hubiera cargado el diccionario desde el disco, etc., este enfoque no funcionará para NSStrings. En su lugar, probablemente debería usar allKeys y luego repetirlos, comparando con [mystring isEqualToString:anotherString].]