Подкласс NSMutableDictionary
Я пытаюсь реализовать подкласс NSMutableDictionary, который возвращает nil вместо того, чтобы бросать исключение NSUndefinedKeyException, когда ключ отсутствует в словаре.
Однако, когда я пытаюсь добавить объекты в словарь, я получаю
[NSMutableDictionary setObject:forKey:]: method only defined for abstract class
NilDictionary.h
@interface NilDictionary : NSMutableDictionary {
}
@end
NilDctionary.m
@implementation NilDictionary
- (id)valueForUndefinedKey:(NSString *)key {
return nil;
}
@end
Должен ли я действительно реализовать все методы из NSMutableDictionary в моем подклассе или есть ли какой-то другой класс, который я должен подклассифицировать?
Уточнение. Моя первоначальная проблема сводилась к тому, что я не мог правильно прочитать документацию.
Если вам нужен подкласс NSMutableDictionary, проверьте правильный ответ. Если вам нужен словарь, который возвращает nil, когда ваш ключ отсутствует, NSMutableDictionary делает это уже.
Ответы
Ответ 1
Ссылка на класс NSMutableDictionary говорит:
В подклассе вы должны переопределить оба его примитивных метода:
1. SetObject: forKey:
2. removeObjectForKey:
Вы также должны переопределить примитивные методы класса NSDictionary
.
Ссылка на класс NSDictionary говорит:
Если вам нужно подклассом NSDictionary
, вам нужно принять во внимание, что представлено Class cluster
- поэтому существует несколько примитивных методов, на основе которых методы концептуально основаны:
1. Количество
2. objectForKey:
3. keyEnumerator
4. initWithObjects: forKeys: кол-во:
В подклассе вы должны переопределить все эти методы.
NSDictionary’s
другие методы работают, вызывая один или несколько из этих примитивов. Непримитивные методы предоставляют удобные способы доступа к нескольким записям одновременно.
Кажется, вам нужно переопределить все эти шесть методов, чтобы сделать ваш подкласс NSMutableDictionary
идеальным.
Ответ 2
Вот ваша проблема. NSDictionary
(и его изменяемый аналог) является частью кластера классов (подробнее о них здесь, под заголовком Class Cluster) и не должен быть подклассифицирован, потому что он вызывает проблемы, такие как то, что вы упомянули (прочитайте примечания к подклассу в Справочник класса NSDictionary). Независимо от того, что вам нужно сделать, у вас будет возможность расширить классы, которые вы хотите использовать, чтобы делать то, что вы хотите сделать. Например, приведенный выше код можно легко разместить в категории (подробнее об категории здесь).
Ответ 3
Вы уверены, что не получаете исключение при передаче "nil" для KEY (а не значения)?