Подтвердить что ты не робот

NSDictionary setValue: forKey: - получение "этот класс не является ключевым значением, совместимым с кодировкой для ключа"

У меня этот простой цикл в моей программе:

for (Element *e in items)
{
    NSDictionary *article = [[NSDictionary alloc] init];
    NSLog([[e selectElement: @"title"] contentsText]);
    [article setValue: [[e selectElement: @"title"] contentsText] forKey: @"Title"];

    [self.articles insertObject: article atIndex: [self.articles count]];
    [article release];
}

Использование библиотеки ElementParser для создания словаря значений из RSS-канала (есть другие значения, кроме "title", которые я пропустил). self.articles - это NSMutableArray, который хранит все словари в документе RSS.

В конце концов, это должно создать массив словарей, каждый словарь, содержащий информацию, которая мне нужна об элементе, в любом индексе массива. Когда я пытаюсь использовать setValue:forKey:, он дает мне

this class is not key value coding-compliant for the key "Title"

ошибка. Это не имеет ничего общего с Interface Builder, это всего лишь код. Почему я получаю эту ошибку?

4b9b3361

Ответ 1

Во-первых, вы используете -setValue:forKey: в словаре, когда вы должны использовать -setObject:forKey:. Во-вторых, вы пытаетесь мутировать NSDictionary, который является неизменным объектом, а не NSMutableDictionary, который будет работать. Если вы переключитесь на использование -setObject:forKey:, вы, вероятно, получите исключение, сообщив вам, что словарь неизменен. Переключите инициализацию article на

NSMutableDictionary *article = [[NSMutableDictionary alloc] init];

и он должен работать.

Ответ 2

Это:

NSDictionary *article = [[NSDictionary alloc] init];

означает, что словарь неизменен. Если вы хотите изменить его содержимое, вместо этого создайте изменяемый словарь:

NSMutableDictionary *article = [[NSMutableDictionary alloc] init];

В качестве альтернативы вы можете создать свой словарь как:

NSDictionary *article = [NSDictionary dictionaryWithObject:[[e selectElement: @"title"] contentsText] forKey:@"Title"];

и отпустите выпуск в конце этого метода.

Кроме того, канонический метод добавления/замены объектов в (изменяемом) словаре - -setObject:forKey:. Если вы не знакомы с Key-Value Coding, я предлагаю вам не использовать -valueForKey: и -setValue:forKey:.