Какао обеспечивает NSDictionary, который по существу является ассоциативным массивом.
Существует ли хороший способ получить двунаправленную ассоциативность? т.е. один путь состоял бы в том, если NSDictionary имел a 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 имеет 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]
.]