首页 > 解决方案 > 为什么协议的存在元类型会丢失继承信息?

问题描述

我有一个通用函数,我在其中传递protocol类型,并根据传递的类型返回一个 required 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 错误

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

有没有其他方法可以设置该约束?我在这里做错了吗?

标签: iosswiftgenericsprotocols

解决方案


事实上,您的getStruct方法type参数中没有协议类型。你得到一个struct,enum或者class那个符合BaseProtocol

您可以查看以下内容以获取更多信息: 答案:为什么我不能将 Protocol.Type 传递给通用 T.Type 参数?


推荐阅读