Подклассы NSMutableDictionary - PullRequest
       4

Подклассы NSMutableDictionary

12 голосов
/ 25 января 2011

Я пытаюсь реализовать подкласс 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 сделает это уже.

Ответы [ 3 ]

25 голосов
/ 25 января 2011

Ссылка на класс NSMutableDictionary говорит:

В подклассе вы должны переопределить оба его примитивных метода:

1.setObject: forKey:
2.removeObjectForKey:

Вы также должны переопределить примитивные методы класса NSDictionary.


Ссылка на класс NSDictionary говорит:

Если вам нужно создать подкласс NSDictionary, вам необходимо принять во внимание то, что представлено Class cluster - поэтому существует несколько примитивных методов, на которых эти методы основаны концептуально:

1,количество
2.objectForKey:
3.keyEnumerator
4.initWithObjects: forKeys: count:

В подклассе вы должны переопределить всех этих методов.

NSDictionary’s другие методы работают, вызывая один или несколько изэти примитивы.Непримитивные методы предоставляют удобные способы одновременного доступа к нескольким записям.


Кажется, вам необходимо переопределить все эти шесть методов , чтобы подкласс NSMutableDictionary работал идеально.,

4 голосов
/ 25 января 2011

Вот ваша проблема.NSDictionary (и его изменяемый аналог) является частью кластера классов (подробнее о них здесь , под заголовком 'Class Cluster') и не должен быть разделен на подклассы, потому что это вызывает такие проблемы, какуже упоминалось (прочитайте примечания по подклассам в NSDictionary Class Reference ).Что бы вы ни делали, у вас будет возможность расширить классы, которые вы хотите использовать, чтобы делать то, что вы хотите.Например, приведенный выше код можно легко разместить в категории (подробнее о категориях здесь ).

0 голосов
/ 25 января 2011

Вы уверены, что не получаете исключение при передаче значения "nil" для KEY (не значения)?

...