Objective c 从符合协议的类创建实例

Objective c 从符合协议的类创建实例,objective-c,class,protocols,Objective C,Class,Protocols,我正在努力实现以下目标: - (id<SomeProtocol>)instanceFromClass:(Class<SomeProtocol>)cls { return [[cls alloc] initUsingSomeConstructorDefinedInProtocolWithValue:_value]; } -(id)instanceFromClass:(Class)cls { 返回[[cls alloc]initUsingSomeConstructo

我正在努力实现以下目标:

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

但是,对于选择器“alloc”,我得到了一个
未知的类方法
错误。如何在签名中指定希望接收符合协议的类?或者,如果该部分是正确的,我如何使用指定协议中定义的构造函数从该参数创建实例?

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

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

当您仍然得到您想要的参数类型检查时,请回答:

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


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

或者做一些协议扩展NSObject协议让协议扩展NSObject实际上对我不起作用。我只是按照@jackslash的建议,在调用
alloc
时将其转换为
(Class)