这就是所谓的"existential any
".
当你使用协议类型作为变量或函数返回类型等的类型时,该类型是存在类型.与具体类型(例如类, struct )相比,存在类型有更多的限制和性能影响.下面是Swift Evolution提案中的一个例子,说明了两者的区别.
protocol P {
associatedtype A
func test(a: A)
}
func generic<ConcreteP: P>(p: ConcreteP, value: ConcreteP.A) {
p.test(a: value)
}
func useExistential(p: P) {
generic(p: p, value: ???) // what type of value would P.A be??
}
在引入any
之前,您可以用相同的方式编写存在类型和具体类型--只需编写它们的名称.这使得什么是存在主义类型,什么不是存在主义类型变得不是很清楚.因为存在主义类型的行为非常不同,所以明确地告诉读者"这是一个存在主义类型"是有用的.这就是any
的用处.
另请参阅Motivation部分.
从Swift 6开始,所有存在类型都必须使用any
前缀.
在SWIFT 5中,您仍然可以编写没有相关类型/Self
要求的协议类型,而不需要any
.另请参阅Source Compatibility部分.
为了最大限度地减少将在SWIFT 6中失效的新编写的代码量,我建议立即为具有自身和相关类型要求的协议要求任何代码.
这就是为什么P
和any P
都是有效的.它们的意思是一样的存在主义类型any P
.但是在Swift 6中,在这里写P
是无效的.