我正在尝试完成以下内容:
- (id<SomeProtocol>)instanceFromClass:(Class<SomeProtocol>)cls
{
return [[cls alloc] initUsingSomeConstructorDefinedInProtocolWithValue:_value];
}
但是,我收到No Known class method for selector 'alloc'
错误。我如何在签名中指定我想要接收符合协议的类?或者,如果该部分是正确的,我如何使用指定协议中定义的构造函数从该参数创建实例?
答案 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
方法添加到协议中。或者你可以做一些演员来告诉编译器相信你。