Как получить ключ для данного объекта из NSMutableDictionary? - PullRequest
31 голосов
/ 07 мая 2010

У меня есть объект, который находится в большом NSMutableDictionary, и мне нужно выяснить, какой ключ у него есть. Поэтому я хочу посмотреть эту «таблицу» из обеих колонок. Не только с ключами, но и с объектами (чтобы получить ключи). Это возможно?

Ответы [ 4 ]

69 голосов
/ 07 мая 2010

Посмотрите на родительский класс (NSDictionary)

- (NSArray *)allKeysForObject:(id)anObject

Который вернет NSArray всех ключей для данного значения объекта. НО он делает это, отправляя сообщение isEqual каждому объекту словаря, поэтому для вашего большого набора данных это может быть не самой лучшей производительностью.

Может быть, вам нужна некоторая форма дополнительной структуры (структур) индексации, чтобы позволить вам находить объекты по некоторым критическим значениям внутри них, связанным с ключом без прямого сравнения объектов

19 голосов
/ 02 мая 2012

Чтобы ответить на ваш вопрос более конкретным образом, используйте следующую команду, чтобы получить ключ для определенного объекта:

NSString *knownObject = @"the object";
NSArray *temp = [dict allKeysForObject:knownObject];
NSString *key = [temp objectAtIndex:0];

//"key" is now equal to the key of the object you were looking for
6 голосов
/ 26 сентября 2012

Это определенно возможно с блочным методом NSDictionary

- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate;

Вам необходимо вернуть объекты, которые удовлетворяют некоторому условию (предикату).

Используйте это так:

    NSSet *keys = [myDictionary keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) {

       BOOL found = (objectForWhichIWantTheKey == obj);
       if (found) *stop = YES;
       return found;

    }];

Проверьте этот ответ для более подробной информации

Как указать блочный объект / предикат, необходимый для keysOfEntriesPassingTest NSDictionary?

6 голосов
/ 07 мая 2010

Взгляните на:

- (NSArray *)allKeysForObject:(id)anObject
...