12

我正在尝试实现 NSMutableDictionary 的子类,当字典中不存在密钥时,它返回 nil 而不是抛出 NSUndefinedKeyException 。

但是,当我尝试将对象添加到我的字典时,我得到

[NSMutableDictionary setObject:forKey:]: method only defined for abstract class

NilDictionary.h

@interface NilDictionary : NSMutableDictionary {
} 
@end

零字典.m

@implementation NilDictionary
- (id)valueForUndefinedKey:(NSString *)key {
  return nil;
}
@end

我真的必须在我的子类中再次实现 NSMutableDictionary 中的所有方法,还是我应该继承一些其他类?

澄清:我最初的问题归结为我无法正确阅读文档。

如果您需要将 NSMutableDictionary 子类化,请查看正确答案。如果你想要一个在你的键不存在时返回 nil 的字典,NSMutableDictionary 已经这样做了。

4

3 回答 3

26

NSMutableDictionary 类参考说:

在子类中,您必须覆盖它的两个原始方法:

1. setObject:forKey:
2. removeObjectForKey:

您还必须覆盖NSDictionary类的原始方法。


NSDictionary 类参考说:

如果确实需要子类化NSDictionary,则需要考虑由 a 表示的Class cluster——因此,这些方法在概念上基于几个原始方法:

1. 计数
2. objectForKey:
3. keyEnumerator
4. initWithObjects:forKeys:count:

在子类中,您必须覆盖所有这些方法。

NSDictionary’s其他方法通过调用这些原语中的一个或多个来操作。非原始方法提供了一次访问多个条目的便捷方式。


看来您需要重写所有这六个方法以使您的NSMutableDictionary子类完美运行。

于 2011-01-25T04:17:30.983 回答
4

这是你的问题。NSDictionary(及其可变对应物)是类集群的一部分(在此处阅读更多关于它们的信息,在“类集群”标题下),不应该被子类化,因为它会导致诸如您提到的问题(阅读子类化注释NSDictionary 类参考)。无论您需要做什么,您都将有一种方法来扩展您想要使用的类,以便做您想做的事情。例如,上面的代码可以很容易地放在一个类别中(在此处阅读有关类别的更多信息)。

于 2011-01-25T04:13:48.187 回答
-1

您确定在为 KEY(不是值)传递“nil”时没有遇到异常吗?

于 2011-01-25T04:53:43.180 回答