泛型函數(shù)可以工作于任何類型,這里是一個(gè)上面swapTwoInts函數(shù)的泛型版本,用于交換兩個(gè)值:
func swapTwoValues<T>(inout a: T, inout b: T) {
let temporaryA = a
a = b
b = temporaryA
}
swapTwoValues函數(shù)主體和swapTwoInts函數(shù)是一樣的,它只在第一行稍微有那么一點(diǎn)點(diǎn)不同于swapTwoInts,如下所示:
func swapTwoInts(inout a: Int, inout b: Int)
func swapTwoValues<T>(inout a: T, inout b: T)
這個(gè)函數(shù)的泛型版本使用了占位類型名字(通常此情況下用字母T來(lái)表示)來(lái)代替實(shí)際類型名(如In、String或Doubl)。占位類型名沒(méi)有提示T必須是什么類型,但是它提示了a和b必須是同一類型T,而不管T表示什么類型。只有swapTwoValues函數(shù)在每次調(diào)用時(shí)所傳入的實(shí)際類型才能決定T所代表的類型。
另外一個(gè)不同之處在于這個(gè)泛型函數(shù)名后面跟著的展位類型名字(T)是用尖括號(hào)括起來(lái)的(<T>)。這個(gè)尖括號(hào)告訴 Swift 那個(gè)T是swapTwoValues函數(shù)所定義的一個(gè)類型。因?yàn)?code style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 14px; padding: 0px 5px; color: rgb(199, 37, 78); background-color: rgb(248, 248, 248); white-space: nowrap; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; margin: 0px 2px; border: 1px solid rgb(234, 234, 234);">T是一個(gè)占位命名類型,Swift 不會(huì)去查找命名為T的實(shí)際類型。
swapTwoValues函數(shù)除了要求傳入的兩個(gè)任何類型值是同一類型外,也可以作為swapTwoInts函數(shù)被調(diào)用。每次swapTwoValues被調(diào)用,T所代表的類型值都會(huì)傳給函數(shù)。
在下面的兩個(gè)例子中,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ā)而實(shí)現(xiàn)的。swap函數(shù)存在于 Swift 標(biāo)準(zhǔn)庫(kù),并可以在其它類中任意使用。如果你在自己代碼中需要類似swapTwoValues函數(shù)的功能,你可以使用已存在的交換函數(shù)swap函數(shù)。