从符合协议的类创建实例

时间:2014-02-11 10:50:37

标签: objective-c class protocols

我正在尝试完成以下内容:

- (id<SomeProtocol>)instanceFromClass:(Class<SomeProtocol>)cls
{
    return [[cls alloc] initUsingSomeConstructorDefinedInProtocolWithValue:_value];
}

但是,我收到No Known class method for selector 'alloc'错误。我如何在签名中指定我想要接收符合协议的类?或者,如果该部分是正确的,我如何使用指定协议中定义的构造函数从该参数创建实例?

2 个答案:

答案 0 :(得分:4)

不确定编译器为什么会抱怨,但您可以通过将参数强制转换回Class

来解决问题
- (id<SomeProtocol>)instanceFromClass:(Class<SomeProtocol>)cls
{
    return [[(Class)cls alloc] initUsingSomeConstructorDefinedInProtocolWithValue:_value];
}

同时仍然为您提供所需的类型检查,如此SO答案所示:Declare an ObjC parameter that's a Class conforming to a protocol

答案 1 :(得分:1)

您对协议的使用“很好”。问题是cls参数被标记为符合定义实例方法(init方法)的协议的类。这并不告诉编译器+alloc方法可用,因为这是NSObject上的类方法。

您可以将+alloc方法添加到协议中。或者你可以做一些演员来告诉编译器相信你。