给予
typealias CP = C & P
protocol P {}
class C {}
class D: C, P {}
和
func f<T: C>(ofType: T.Type) {}
,并且给定的CP
与C
符合预期:
let cp: CP = D()
let c: C = cp
为什么出现以下错误?
f(ofType: CP.self)
错误:无法将类型“ CP.Protocol”(又名“(C&P).Protocol”)的值转换为预期的参数类型“ C.Type”
在版本4中,已在Swift中添加了声明类和协议的存在性的功能,请参见SE-0156
答案 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()
。但是在那种情况下应该调用什么init
? CP
是类型必须为C
的 some 子类的要求,但是哪一个是?它甚至不能是C
,因为C
不符合P
。那么Swift应该构造什么?