你能定义一个Class(objc_class)参数来在编译时获得一个必需的子类吗?

时间:2014-02-19 15:55:32

标签: objective-c

我有以下方法:

- (FDModel *)_modelForClass: (Class)modelClass 
    withIdentifier: (NSString *)identifier

应该接受一个Class和一个标识符,创建一个modelClass的实例,分配标识符并根据假设modelClass是FDModel的子类这一事实做一些其他的工作。

如果[modelClass isSubclassOfClass: [FDModel class]] == NO我可以提出引发错误或异常的检查,但我试图看看是否有办法在编译时强制执行此操作。

编辑:我知道有些人认为这是一个明显的工厂方法,但是modelClass参数实际上是由我的库的用户通过委托回调- (Class<FDModel>)modelClassForDictionary: (NSDictionary *)dictionary;传递的。这个问题更多的目的是让我的库的用户返回一个具有特定子类的类。

2 个答案:

答案 0 :(得分:3)

我会认为你问题的答案是否定的;没有办法检查作为参数传递的类是否属于某种类型。

但是我想说你的问题的本质主要指向一个设计问题,即你的实例生成方法不能表示为工厂方法吗?像这样:

@interface FDModel

+ (instancetype)modelWithIdentifier:(NSString *)identifier;

@end

在上述情况下,您只需执行以下操作:

[FDModel modelWithIdentifier:anIdentifier];

返回的实际类(和初始化逻辑)由工厂方法实现通过FDModel类的子类化指定:

@implementation FDModelSubclass

+ (instancetype)modelWithIdentifier:(NSString *)identifier
{
    FDModel *model = [super modelWithIdentifier:identifier];
    if (model)
    {
        // do additional init stuff
    }
    return model;
}

@end

无需检查,也没有机会出错。

答案 1 :(得分:1)

经过一些研究后,我认为你不能在编译时这样做 - 你必须在运行时按预期做到这一点。

BOOL classConformsToProtocol = [class conformsToProtocol:@protocol(OKAProtocol)];

OR

BOOL classConformsToProtocol = [self class:[OKAClass class] conformsToProtocol:@"OKAProtocol"];

------

- (BOOL)class:(Class)class conformsToProtocol:(NSString *)protocol;
{
  return [class conformsToProtocol:NSProtocolFromString(protocol)];
}