Подклассы NSDictionary не работает - PullRequest
0 голосов
/ 17 мая 2011

У меня есть словарь, который я читаю из списка. Я хочу создать подкласс 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 ]

4 голосов
/ 17 мая 2011

Присвоение NSDictionary указателю MyDict не делает его экземпляром MyDict.

Один из способов сделать это - создать категорию для добавления вашего метода в NSDictionary. См. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1 для информации.

2 голосов
/ 17 мая 2011

В вашем классе нет суперкласса. Кроме того, общепринятым считается, что подкласс NSDictionary очень трудно подклассить, потому что это кластер класса . Вы на самом деле не получаете NSDictionary назад, когда вы:

NSDictionary * myDict = [NSDictionary dictionary];

Вы получаете закрытый подкласс (в данном случае NSCFDictionary).

Возможно, вы захотите попытаться определить свои собственные словарные ключи, как это делает Apple:

NSString * const MyWonderfulUnicornKey = @"MyWonderfulUnicornKey";
...