通用函数和类型约束是swift中的泛型函数多态

时间:2017-09-08 09:02:05

标签: swift generics overloading

下面有两个功能

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中的泛型函数多态吗?

1 个答案:

答案 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版本的有效输入参数。