什么是Swift中必需或需要的通用函数?

oro*_*ome 1 generics coding-style swift

Apple的Swift 语言文档提供了以下使用泛型函数类型参数的示例(在"操作中的类型约束"部分下):

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

这里有必要使用吗?是不是

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

当量?如果没有,我错过了什么?如果是这样的话,有理由选择前者而不是后者或一般的经验法则来决定使用泛型函数吗?

Nat*_*ook 5

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

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

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

所有这些都指向需要创建通用函数的两个场景:

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

  2. 您需要在函数的两个或更多不同参数之间建立关系,以使它们需要具有相同类型或相关类型.

您的示例符合这两个标准,但即使Swift未在第1种情况下放置需要泛型的限制,情况#2仍然适用.