泛型函數(shù)可以工作于任何類型,這里是一個上面swapTwoInts函數(shù)的泛型版本,用于交換兩個值:
func swapTwoValues<T>(inout a: T, inout b: T) {
let temporaryA = a
a = b
b = temporaryA
}
swapTwoValues函數(shù)主體和swapTwoInts函數(shù)是一樣的,它只在第一行稍微有那么一點點不同于swapTwoInts,如下所示:
func swapTwoInts(inout a: Int, inout b: Int)
func swapTwoValues<T>(inout a: T, inout b: T)
這個函數(shù)的泛型版本使用了占位類型名字(通常此情況下用字母T來表示)來代替實際類型名(如In、String或Doubl)。占位類型名沒有提示T必須是什么類型,但是它提示了a和b必須是同一類型T,而不管T表示什么類型。只有swapTwoValues函數(shù)在每次調(diào)用時所傳入的實際類型才能決定T所代表的類型。
另外一個不同之處在于這個泛型函數(shù)名后面跟著的展位類型名字(T)是用尖括號括起來的(<T>)。這個尖括號告訴 Swift 那個T是swapTwoValues函數(shù)所定義的一個類型。因為T是一個占位命名類型,Swift 不會去查找命名為T的實際類型。
swapTwoValues函數(shù)除了要求傳入的兩個任何類型值是同一類型外,也可以作為swapTwoInts函數(shù)被調(diào)用。每次swapTwoValues被調(diào)用,T所代表的類型值都會傳給函數(shù)。
在下面的兩個例子中,T分別代表Int和String:
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
// someInt is now 107, and anotherInt is now 3
var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)
// someString is now "world", and anotherString is now "hello"
注意
上面定義的函數(shù)swapTwoValues是受swap函數(shù)啟發(fā)而實現(xiàn)的。swap函數(shù)存在于 Swift 標(biāo)準(zhǔn)庫,并可以在其它類中任意使用。如果你在自己代碼中需要類似swapTwoValues函數(shù)的功能,你可以使用已存在的交換函數(shù)swap函數(shù)。