![](/img/trans.png)
[英]Swift Generics... Checking conformance to protocol with associated type
[英]swift generics and protocol associated type
我想知道以下代码是否相同或不同,如果不同,请说明如何。
第一个问题是一个接受类型为Receiver类型的参数的函数
func genericFunc<T: Receiver>(input: T){
// code
}
VS
func genericFunc(input: Receiver){
// code
}
它们是相同还是不同?
第二个问题是一个具有关联类型的协议
protocol TheProtocol{
associatedtype myType
var anyProperty: myType { get set }
}
func genericFunc<T: TheProtocol>(input: T){
// code
}
VS
protocol TheProtocol{
associatedtype myType
var anyProperty: myType { get set }
}
func genericFunc(input: TheProtocol){
// code
}
func genericFunc<T: Receiver>(input: T)
这是一个通用函数,采用符合协议的特定具体类型Receiver
。 如果您使用不同的类型调用genericFunc
,则编译器将为您使用的每种类型生成专门的genericFunc
副本。 (可以进行一些优化来删除其中一些副本,但这是它在概念上的工作方式。)
func genericFunc(input: Receiver)
这是一个非泛型函数,需要“接收者存在”类型的参数。 存在是编译器生成的框,一种类型擦除器,用于包装您传递的实际值。
添加关联类型时,这不会改变。 第一个是通用函数,将针对特定类型进行专用。 第二个要求存在。
Swift目前无法为具有关联类型的协议生成存在,因此最终版本将无法编译。 当Swift可以使用时,该功能将称为“通用存在”,并且可能会拼写为:
func genericFunc(input: any Receiver)
有关Swift团队对未来语法的思考的更多信息,请参阅《 改进泛型的UI》 。
有关existential容器的更多详细信息,请参见了解Swift性能 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.