2010-03-10 5 views
10

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 и обратно, и поддакивать для других полей.

ответ

10

Ближайшая вещь для вас, я считаю, 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].]

Смежные вопросы