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

Подкласс 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 делает это уже.

4b9b3361

Ответ 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 (а не значения)?