给定
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
应该叫什么呢?CP
0要求类型是C
的某个子类,但是哪一个?它甚至不可能是C
,因为C
不符合P
。那么Swift应该构建什么呢?