下面有两个功能
func append<T>(_ value: T){
......
}
func append<T: A>(_ value: T){
......
}
当我这样称呼他们时他们执行多态,但我无法从Apple得到任何理论依据,
let a:A = A()
append(a) //call func append<T: A>
let b:B = B()
append(b) //call func append<T>
为什么append(a)
致电append<T: A>
?通用函数和类型约束是swift中的泛型函数多态吗?
答案 0 :(得分:0)
您看到的效果实际上是函数重载(也称为ad-hoc多态)。
当一个函数有多个重载版本时(在你的情况下,没有泛型函数和带有类型约束的泛型函数),编译器将始终尝试调用最特定于输入参数的函数版本。 / p>
因此,对于满足类型约束的输入参数,编译器将调用具有类型约束的函数,而对于不满足类型约束的输入参数,将调用不带约束的版本。 / p>
如果您声明一个继承自C
的新类A
,并且还声明了append
的重载版本,其中类型约束,您可以更好地看到此行为课程为C
。在这种情况下,可以为类C
调用3个重载版本中的任何一个,但是将再次调用最具体的版本,其中约束用于类C
本身。
class A {}
class B {}
class C:A {}
func append<T>(_ value: T){
print("Most generic version called")
}
func append<T: A>(_ value: T){
print("Version with type constraint for class A called")
}
func append<T:C>(_ value:T){
print("Version with type constraint for class C called")
}
let a:A = A()
append(a) //calls func append<T: A>
let b:B = B()
append(b) //calls func append<T>
append(C()) //calls func append<T:C>
使用非通用的重载函数也可以实现相同的效果。
func myFunc(_ val: A){
print("Non generic function with input argument of type A called")
}
func myFunc(_ val: C){
print("Non generic function with input argument of type C called")
}
myFunc(a) //myFunc(_ val: A) called
myFunc(c) //myFunc(_ val: C) called
如果您发表评论myFunc(_ val: C)
,则会在两种情况下都调用myFunc(_ val: A)
,因为c
是两个myFunc
版本的有效输入参数。