繁体   English   中英

快速的泛型和协议相关类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM