NSLog(@"%@", [[dictionary objectForKey:[images objectAtIndex:i]] objectForKey:@"filename"]);
Я получаю все нули.
Получение ключа из массива работает нормально.Либо у dictionary
нет объекта для ключа, который вы получили, либо в найденном словаре нет объекта для ключа @"filename"
.
Я предполагаю, что это потому, что мои [imagesobjectAtIndex: i] возвращает что-то отличное от строки, однако я попытался использовать slappin в (NSString *), и я все еще получаю пустые значения.
Во-первых, строки NSStrings не являются единственными действительными ключами.Любой копируемый объект можно использовать в качестве ключа словаря.
Что еще более важно, помните, что вы никогда не работаете напрямую со структурами объектов, но с указателями на объекты.objectAtIndex:
возвращает указатель на объект;когда вы приводите его возвращаемое значение, вы говорите компилятору, что objectAtIndex:
вернет указатель на объект NSString.Приведение указателя не меняет сам указатель;это только говорит компилятору, что ожидать на другом конце этого указателя.Если objectAtIndex:
равен , возвращая указатели, скажем, на объекты Foo, приведение их к указателям на объекты NSString не заставит их указывать на объекты NSString;они по-прежнему будут указывать на объекты Foo, поэтому поиск этих объектов в словаре, ключи которого являются строками, все равно будет неудачным.
Другая вещь, которую следует учитывать: почему вы не знаете, что находится в этом массиве?Вы создали массив.Вы заполнили массив.Конечно, тогда вы должны знать, что в нем.objectAtIndex:
не возвращает ничего, кроме (указателя) на объект, который находится в массиве.
Если вы думаете, objectAtIndex:
возвращает объекты, которые не являются допустимыми ключами, то вы должны проверить массив, используя либоNSLog или отладчик.Проверьте, что содержит массив и каковы классы этих объектов.
Скорее всего, массив содержит объекты, которые были бы допустимы в качестве ключей, но не являются ключами в словаре, или он содержит объекты, которые являются ключамив словаре, но словари, которые являются объектами для этих ключей, не содержат ключ @"filename"
.Изучите как массив, так и внешний словарь.
Еще одно предостережение, которое может вас подвести: Если вы сохраняете в массиве строки mutable , и это ключи, которые вы используетеизначально вставляются словари во внешний словарь, и вы изменяете эти строки, что делает их не соответствующими ключам во внешнем словаре.Помните, что словари копируют свои ключи (именно поэтому ключи должны быть копируемыми);Вы изменяете строку в массиве, но словарь сделал копию ранее, и эта копия не изменяется.(Такова цель создания копии: тот, кто делает копию, в данном случае словарь, хочет сохранить объект как есть, не получая каких-либо мутаций, которые происходят позже.)
Итак, еслиесли вы хотите пересмотреть любую из строк, вам придется заменить их в массиве и сохранить объект внешнего словаря для старого ключа под новым ключом.Вы также должны будете предпринять шаги, чтобы предотвратить дублирование ключей;словарь содержит только один объект на ключ, а массив может содержать один и тот же объект любое количество раз.