为什么协议的存在性元类型会丢失继承信息?

时间:2018-09-21 14:23:44

标签: ios swift generics protocols

我有一个通用函数,我在其中传递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))

它不起作用并产生以下错误:

xcode error

如果我删除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")
   }
}

还有其他方法可以施加约束吗?我在这里做错什么了吗?

1 个答案:

答案 0 :(得分:0)

实际上,您的getStruct方法的type参数中没有协议类型。您得到符合struct

enumclassBaseProtocol

您可以查看以下详细信息: Answer of: Why can't I pass a Protocol.Type to a generic T.Type parameter?