gpt4 book ai didi

swift - 泛型函数和类型约束泛型函数在swift中的多态性

转载 作者:行者123 更新时间:2023-11-28 08:02:56 24 4
gpt4 key购买 nike

下面有两个函数

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> ? Generic Function 和 Type Constraints Generic Function polymorphism in swift?

最佳答案

您看到的效果实际上是函数重载(也称为临时多态性)。

当一个函数有多个重载版本时(在你的例子中,一个没有类型约束的泛型函数和一个有类型约束的泛型函数),编译器将始终尝试调用最适合你的输入参数的函数版本。

因此对于满足类型约束的输入参数,编译器将调用具有类型约束的函数,而对于不满足类型约束的输入参数,将调用没有约束的版本。

如果您声明一个继承自 A 的新类 C 并且您还声明了 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 的有效输入参数。

关于swift - 泛型函数和类型约束泛型函数在swift中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46112625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com