我有一个通用函数,我在其中传递protocol
类型,并根据传递的类型返回所需的struct
。如果即使通过的协议符合通用协议,我仍然对通用协议施加协议约束,我会收到错误消息。
protocol BaseProtocol {}
protocol ProtocolA: BaseProtocol {}
protocol ProtocolB: BaseProtocol {}
struct StructA: ProtocolA {}
struct StructB: ProtocolB {}
当我用这样的约束定义函数时:
func getStruct<T: BaseProtocol>(type: T.Type) -> T {
switch type {
case is ProtocolA.Protocol:
return StructA() as! T
case is ProtocolB.Protocol:
return StructB() as! T
default:
fatalError("Unknown Type")
}
}
let result = getStruct(type: ProtocolA.self)
print(type(of: result))
它不起作用并产生以下错误:
如果我删除BaseProtocol约束,则一切正常:
func getStruct<T: Any>(type: T.Type) -> T {
switch type {
case is ProtocolA.Protocol:
return StructA() as! T
case is ProtocolB.Protocol:
return StructB() as! T
default:
fatalError("Unknown Type")
}
}
还有其他方法可以施加约束吗?我在这里做错什么了吗?
答案 0 :(得分:0)
实际上,您的getStruct
方法的type
参数中没有协议类型。您得到符合struct
enum
,class
或BaseProtocol
您可以查看以下详细信息: Answer of: Why can't I pass a Protocol.Type to a generic T.Type parameter?