как получить доступ к NSDictionary через упорядоченный NSArray - PullRequest
0 голосов
/ 20 июля 2010

Итак, у меня есть NSDictionary, который содержит несколько объектов со свойствами (ключ: значения), но проблема в том, что они нужны мне в определенном порядке.

Хранится как NSArray - это списокобъектов, которые я хотел бы использовать в качестве ключей для NSDictionary.

, я могу вывести NSArray и NSDictionary на консоль, однако, когда я получаю доступ к каждому значению, указанному в имени файла"с:

for(NSUInteger i=0; i<[images count]; i++)
NSLog(@"%@", [[dictionary objectForKey:[images objectAtIndex:i]] objectForKey:@"filename"]);

Я получаю все нули.

У кого-нибудь есть идеи?Я предполагаю, что это потому, что мой [images objectAtIndex:i] возвращает что-то отличное от строки, однако я попытался использовать slappin в (NSString *) и все равно получаю нули.

Ответы [ 2 ]

0 голосов
/ 20 июля 2010
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 , и это ключи, которые вы используетеизначально вставляются словари во внешний словарь, и вы изменяете эти строки, что делает их не соответствующими ключам во внешнем словаре.Помните, что словари копируют свои ключи (именно поэтому ключи должны быть копируемыми);Вы изменяете строку в массиве, но словарь сделал копию ранее, и эта копия не изменяется.(Такова цель создания копии: тот, кто делает копию, в данном случае словарь, хочет сохранить объект как есть, не получая каких-либо мутаций, которые происходят позже.)

Итак, еслиесли вы хотите пересмотреть любую из строк, вам придется заменить их в массиве и сохранить объект внешнего словаря для старого ключа под новым ключом.Вы также должны будете предпринять шаги, чтобы предотвратить дублирование ключей;словарь содержит только один объект на ключ, а массив может содержать один и тот же объект любое количество раз.

0 голосов
/ 20 июля 2010

Если вещи в словаре не являются словарями, не должна ли эта секунда objectForKey быть valueForKey?

...