- 泛型函数可以用于任何类型. 这里是上面提到的
swapTwoInts(_:, _:)
函数的泛型版本, 叫做swapTwoValues(_:_:)
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
- 上面的
swapTwoInts(_:, _:)
中, 占位符类型T
就是一个类型形式参数的例子. 类型形式参数指定并且命名一个占位符类型, 紧挨着写在函数名后面的一堆尖括号里(比如<T>
). - 一旦你指定了一个类型形式参数, 你就可以用它定义一个函数形式参数 (比如
swapTwoInts(_:, _:)
函数中的形式参数a
和b
)的类型, 或者用它做函数返回值类型, 或者做函数体重类型标注. 在不同情况下, 用调用函数时的实际类型来替换类型形式参数 - 你可以通过在尖括号里写多个用逗号隔开的类型形式参数名, 来提供更多类型形式参数.
命名类型形式参数
-
大多数情况下, 类型形式参数的名字要有描述性, 比如
Dictionary<Key, Value>
中的Key
和Value
, 借此告知读者类型形式参数和泛型类型、泛型用到的函数之间的关系. 但是, 他们之间的关系没有意义时, 一般按惯例用单个字母命名, 比如T
、U
、V
, 比如上面的swapTwoInts(_:, _:)
中的T
. -
类型形式参数永远用大写开头的驼峰命名法(比如
T
和MyTypeParameter
)命名, 以指明它们是一个类型的占位符, 不是一个值.
网友评论