Двунаправленная карта в Cocoa

Cocoa предоставляет NSDictionary, который по существу является ассоциативным массивом.

Есть ли хороший способ получить двунаправленную ассоциативность? т.е. один способ был бы, если бы NSDictionary имел метод keyForObject:, который отражал поведение objectForKey:.

Мне все равно, что NSDictionary не способ получить это. Я знаю, что NSDictionary предоставляет keysOfEntriesPassingTest:, но возвращает NSSet *, который не выглядит очень чистым для того, что я хочу иметь.

Вот пример:

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

Я хочу перевести между c0 и synckey и обратно, а также для других полей.

Ответ 2

Ближайшая вещь для вас, я считаю, allKeysForObject:. Это возвращает NSArray, содержащий ключи, соответствующие всем вхождениям данного объекта в словаре. Очевидно, что если объект находится в словаре только один раз, NSArray будет содержать только один объект.

Итак, с вашим примером:

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

Этот дополнительный код вернет массив, содержащий 1 строковый объект, оценивающий на @ "c7":

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

[Кроме того: обратите внимание, что это будет работать только из-за того, как работает компилятор; он принимает все вхождения @ "wi_prio" и делает их одним и тем же объектом. Если бы вы, возможно, загрузили словарь с диска и т.д., Этот подход не будет работать для NSStrings. Вместо этого вы, вероятно, должны использовать allKeys, а затем перебирать их по сравнению с [mystring isEqualToString:anotherString].]