Swift泛型:无法将类和子类型的存在性值转换为预期的参数类型

时间:2018-12-05 16:33:05

标签: swift generics

给予

typealias CP = C & P
protocol P {}
class C {}
class D: C, P {}

func f<T: C>(ofType: T.Type) {}

,并且给定的CPC符合预期:

let cp: CP = D()
let c: C = cp

为什么出现以下错误?

f(ofType: CP.self)
  

错误:无法将类型“ CP.Protocol”(又名“(C&P).Protocol”)的值转换为预期的参数类型“ C.Type”


在版本4中,已在Swift中添加了声明类和协议的存在性的功能,请参见SE-0156

1 个答案:

答案 0 :(得分:3)

这是“协议不符合其自身”的另一个实例。尽管CP描述了一种类型,该类型被认为既是C的子类又是P的实现者,但它们都不是本身。< / p>

考虑以下情况:C具有必需的init,而f()则将其调用:

class C {
    required init() {}
}


func f<T: C>(ofType: T.Type) {
    T()
}

f(ofType: CP.self)

这等效于直接调用CP()。但是在那种情况下应该调用什么initCP是类型必须为C some 子类的要求,但是哪一个是?它甚至不能是C,因为C不符合P。那么Swift应该构造什么?