Ответ 1
CHDataStructures framework имеет CHBidirectionalDictionary.
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 и обратно, а также для других полей.
CHDataStructures framework имеет CHBidirectionalDictionary.
Ближайшая вещь для вас, я считаю, 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]
.]