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



给定

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

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

并且给定的CCD_ 1与CCD_

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

为什么会出现以下错误?

f(ofType: CP.self)

错误:无法将类型"CP。Protocol"(又名"(C&p(.Protocol"(的值转换为预期的参数类型"C.type">


Swift在版本4中增加了声明类和协议存在性的能力,请参阅SE-0156

这是"协议不符合自身"的另一个例子。虽然CP描述了一个类型,它被承诺既是C的子类,也是P的实现者,但这两者都不是本身

考虑以下情况:C有一个必需的init,f()调用它:

class C {
required init() {}
}

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

这相当于直接调用CP()。但在这种情况下,init应该叫什么呢?CP0要求类型是C某个子类,但是哪一个?它甚至不可能是C,因为C不符合P。那么Swift应该构建什么呢?

最新更新