gpt4 book ai didi

generics - Swift 中什么时候需要或需要泛型函数?

转载 作者:搜寻专家 更新时间:2023-11-01 05:59:24 24 4
gpt4 key购买 nike

Apple 的 Swift language documentation提供了以下使用泛型函数类型参数 的示例(在“Type Constraints in Action”部分下):

func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
for (index, value) in enumerate(array) {
if value == valueToFind {
return index
}
}
return nil
}

这里有必要使用其中之一吗?是不是

func findIndex(array: [Equatable], valueToFind: Equatable) -> Int? {
for (index, value) in enumerate(array) {
if value == valueToFind {
return index
}
}
return nil
}

等效?如果没有,我错过了什么?如果是这样,是否有理由更喜欢前者而不是后者,或者决定使用通用函数的一般经验法则?

最佳答案

两者并不等同。通用函数表示您可以使用两个参数调用此函数:一个 T 数组和一个要查找的值,该值也是 T 类型,并添加一个约束T 必须是 Equatable。 (如果没有该约束,value == valueToFind 比较将无法编译。)

第二个函数只需要数组是 Equatable 的实例,并且要查找的值是 Equatable,所以理论上你可以用 调用它>[String] 数组和一个 Int,这最终会使相等比较变得毫无意义。

(此外,当协议(protocol)在其任何声明中使用 Self 或具有关联的类型别名时,Swift 限制将协议(protocol)用作类型,因此第二个示例也不会编译,但是这不是基于协议(protocol)的函数和泛型函数之间的主要区别。)

所有这些都指向需要创建通用函数的两种情况:

  1. 您希望该函数可用于符合协议(protocol)的所有类型,但该协议(protocol)不能用作类型(如 Equatable 或几乎任何其他 Swift 协议(protocol),老实说)。

  2. 您需要在一个函数的两个或多个不同参数之间建立关系,这样它们就需要属于同一类型或相关类型。

您的示例符合这两个条件,但即使 Swift 没有在案例 #1 中设置需要泛型的限制,案例 #2 仍然适用。

关于generics - Swift 中什么时候需要或需要泛型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26554201/

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