我有以下方法:
- (FDModel *)_modelForClass: (Class)modelClass
withIdentifier: (NSString *)identifier
应该接受一个Class和一个标识符,创建一个modelClass的实例,分配标识符并根据假设modelClass是FDModel的子类这一事实做一些其他的工作。
如果[modelClass isSubclassOfClass: [FDModel class]] == NO
我可以提出引发错误或异常的检查,但我试图看看是否有办法在编译时强制执行此操作。
- (Class<FDModel>)modelClassForDictionary: (NSDictionary *)dictionary;
传递的。这个问题更多的目的是让我的库的用户返回一个具有特定子类的类。
答案 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)];
}