子类化NSDictionary不起作用

时间:2011-05-17 02:18:09

标签: objective-c cocoa-touch ios nsdictionary

我有一本字典,我从一个plist中读到。我想创建一个NSDictionary的子类来实现类似下面的内容,这样我就可以避免在源代码中的任何地方使用@"key name"

@interface MyDict{
}
-(NSString*) textString;
@end

@implementation MyDict
-(NSString*) textString {
    return [self objectForKey:@"textString"];
}
@end

在我的另一种方法中:

MyDict *d = ... // something i read from plist
NSString *str = [d textString];

当我调用该方法时,应用程序因“无法识别的选择器textString”而崩溃。这有什么不对?

2 个答案:

答案 0 :(得分:4)

将NSDictionary分配给MyDict指针并不会使其成为MyDict实例。

您可以这样做的一种方法是创建一个类别,将您的方法添加到NSDictionary。有关信息,请参阅http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1

答案 1 :(得分:2)

你的班级没有超类。此外,传统观点认为,NSDictionary的子类很难,因为它是class cluster。当你:

时,你实际上并没有得到NSDictionary
NSDictionary * myDict = [NSDictionary dictionary];

你得到一个私有子类(在这种情况下为NSCFDictionary)。

您可能想尝试定义自己的字典键,就像Apple一样:

NSString * const MyWonderfulUnicornKey = @"MyWonderfulUnicornKey";