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

时间:2019-08-04 11:15:26

标签: swift generics

我想知道以下代码是否相同或不同,如果不同,请说明如何。

第一个问题是一个接受类型为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
}

1 个答案:

答案 0 :(得分:0)

func genericFunc<T: Receiver>(input: T)

这是一个通用函数,采用符合协议Receiver的特定具体类型。如果您使用不同的类型调用genericFunc,则编译器将为您使用的每种类型生成genericFunc的专用副本。 (可以进行一些优化来删除其中一些副本,但这在概念上就是这样。)

func genericFunc(input: Receiver)

这是一个非泛型函数,需要“接收者存在”类型的参数。存在是一个由编译器生成的框,一种类型擦除器,用于包装您传递的实际值。

添加关联类型时,这不会改变。第一个是通用函数,将针对特定类型进行专用。第二个要求存在。

Swift当前无法为具有关联类型的协议生成存在,因此最终版本将无法编译。如果可以使用Swift,则该功能将被称为“广义存在性”,并且可能会拼写为:

func genericFunc(input: any Receiver)

有关Swift团队对未来语法的更多思考,请参见Improving the UI of generics

有关生存​​容器的更多详细信息,请参见Understanding Swift Performance