我想知道以下代码是否相同或不同,如果不同,请说明如何。
第一个问题是一个接受类型为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
}
答案 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。