return [[parentObject allKeysForObject:item] objectAtIndex:0];
Однако, когда в данном словаре в дереве есть несколько элементов с одинаковым значением, этот оператор всегда возвращает первый элемент, имеющий это значение…
Хорошо, да уж.Вот что вы сказали ему: «Дайте мне все ключи для этого значения;достань мне первый элемент в массиве;вернуть это ».
… этот оператор всегда возвращает первый элемент, который имеет это значение (кажется, что для сравнения строк используются значения isEqualToString: или hash).
Этоне то утверждение, которое делает это;это то, как работают словари: каждый ключ может быть только в словаре один раз и может иметь только один объект в качестве значения, и это выполняется с использованием хэша ключа и путем отправки сообщений ключей isEqual:
(не связанных с NSStringisEqualToString:
- клавиши не обязательно должны быть строками *).
С другой стороны, значения не являются унифицированными.Любое количество ключей может иметь одинаковое значение.Вот почему переход от значений к ключам - и особенно к ключу a - так проблематичен.
* В любом случае, не в NSDictionary.Когда вы пытаетесь сгенерировать вывод plist, он прекратит работу, если в словаре есть какие-либо нестроковые ключи.
Я попытался в следующий раз;
-(NSString*)keyFromDictionary:(NSDictionary*)dict forItem:(id)item
{
for( uint i = 0; i < [[dict allKeys] count]; i++ ) {
id object = [dict objectForKey:[[dict allKeys] objectAtIndex:i]];
if ( &object == &item ) {
return [[dict allKeys] objectAtIndex:i];
}
}
return nil;
}
Но это всегда возвращает ноль.
Это наименьшая из проблем этого кода.
Во-первых, при итерации NSArray вы, как правило, не должны использовать индексы без крайней необходимости.Гораздо понятнее использовать быстрое перечисление .
Во-вторых, когда вам нужны индексы в NSArray, правильный тип - NSUInteger
.Не смешивайте и не совмещайте типы, когда вы можете помочь.
В-третьих, я не знаю, что вы хотели сделать с оператором address-of, но на самом деле вы взяли адрес этих операторов.две переменные.Таким образом, вы сравнили, является ли локальная переменная object
той же самой переменной, что и переменная аргумента item
.Поскольку они не являются одной и той же переменной, этот тест всегда возвращает false, поэтому вы никогда не возвращаете объект - единственная другая точка выхода возвращает nil
, так что это всегда происходит.
Проблема с этимкод и более ранняя однострочная строка - это то, что вы пытаетесь перейти от значения к одному ключу, что противоречит принципам работы словарей: уникальны только ключи;любое количество ключей может иметь одинаковое значение.
Вам нужно использовать что-то еще в качестве элементов.Использование ключей в качестве предметов было бы одним из способов;создание объекта модели для представления каждой строки было бы другим.
Если вы идете по маршруту модель-объект, не забудьте запретить нескольким строкам в одном виртуальном словаре иметь одинаковыеключ.NSMutableSet plus, реализующий hash
и isEqual:
, поможет в этом.
Вы, вероятно, также должны внести те же изменения в вашу обработку массивов.