【发布时间】:2014-05-25 09:23:13
【问题描述】:
我有一个工厂类,它有一个类似的 init 方法
+(instancetype)initWithDictionary:(NSDictionary);
在实现中类似于
@class ClassA,ClassB,ClassC,.... lots and lots of classes; // like 20+
@implementation
+(instancetype)initWithDictionary:(NSDictionary *)dictionary
{
NSString *factoryKey = dictionary[@"some useful key to create a class"];
Class theCorresondingClass = [self classForKey:factoryKey];
return [[theCorrespondingClass alloc] initWithDictionary:dictionary];
}
-(Class)classForKey:(NSString *)key
{
static NSDictionary *classesDictionary;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSArray *classes = [[ClassA class],[ClassB class],[....],.....]; // the 20+ class from above
NSArray *keysForClasses = [@"KeyA",@"KeyB,....]; // the 20 keys for the classes
classesDictionary = [NSDictionary dictionaryWithObjects:classes forKeys:keysForClasses];
}
return classesDictionary[key];
}
问题是我从前向声明中分配初始化(在字典中这是一个错误),这是一个编译时错误 - 我认为唯一可能的解决方案是将所有类导入工厂 - 这看起来像糟糕的举动——因为理想情况下我希望工厂支持其他类的注册——这样它将在运行时创建这些类——或者定义工厂中的所有类——这似乎更糟——
问题是所有类都继承自一个公共基类,所以我知道在运行时它会被正确定义(alloc init 方法)-
有什么方法可以对类名进行@dynamic 定义吗?也许创建一个宏来存根工厂类中的空类?
苹果是如何在NSTextCheckingResult.h factory 做这样的事情的?
【问题讨论】:
标签: objective-c dynamic runtime forward-declaration