A key - это то, что вы используете для доступа к объекту в словаре. Ваши ключи и объекты меняются местами в каждой строке, которую вы называете -[bookmarks setObject:... forKey...]
в коде. Проблема в вашем случае возникает потому, что вы пытаетесь обработать объекты NSURL как объекты NSString - [bookmarks objectForKey:(NSString *)each]
- и словарь пытается получить длину предполагаемой строки, вызывая -length
, которая существует для NSString, но не для NSURL .
Если вы всегда создаете словарь с одними и теми же объектами, рассмотрите возможность использования более компактного конструктора varargs для NSDictionary
. (Обратите внимание, что последний аргумент, разделенный запятыми, должен быть nil - см. соответствующую документацию ). Вы также можете использовать -[NSDictionary dictionaryWithObjects:forKeys:]
с двумя объектами NSArray, содержащими URL-адреса и имена закладок. (Между прочим, приведение строковых литералов как NSString*
для создания NSURL совершенно не требуется.)
NSDictionary *bookmarks = [NSDictionary dictionaryWithObjectsAndKeys:
[NSURL URLWithString:@"http://www.stanford.edu"],
@"Stanford University",
[NSURL URLWithString:@"http://www.apple.com"],
@"Apple",
[NSURL URLWithString:@"http://www.berkeley.edu"],
@"Berkeley",
[NSURL URLWithString:@"http://cs193p.stanford.edu"],
@"CS193P",
nil];
Кроме того, у вас есть скрытая ошибка, которая еще не была упомянута: browser
- это NSEnumerator
, но вы звоните valueForKey:
, как будто это было NSDictionary
, а не bookmarks
. Это вызовет аналогичный сбой и для нераспознанного селектора. (Даже для объектов словаря вы должны вместо этого вызывать -objectForKey:
; -valueForKey:
используется в основном для / от привязок какао , и выполняет дополнительную работу, которая вам не нужна. Я понимаю, что это сбивает с толку, так как мы думаем в терминах «пары ключ-значение», но это так…)
Наконец, вы также можете несколько упростить код перечисления. (Цикл for-in в NSDictionary
перечисляет свои ключи так же, как -keyEnumerator
.)
Вот как я бы предложил сделать последнюю часть:
NSURL *url
for (NSString *key in bookmarks) {
url = [bookmarks objectForKey:key];
NSLog(@"%@", [url absoluteURL]);
}