Swift泛型函數
泛型函數
泛型函數
可以工作於任何類型,這裡是一個上麵swapTwoInts
函數的泛型版本,用於交換兩個值:
func swapTwoValues<T>(inout a: T, inout b: T) {
let temporaryA = a
a = b
b = temporaryA
}
swapTwoValues
函數主體和swapTwoInts
函數是一樣的,它隻在第一行稍微有那麼一點點不同於swapTwoInts
,如下所示:
func swapTwoInts(inout a: Int, inout b: Int)
func swapTwoValues<T>(inout a: T, inout b: T)
這個函數的泛型版本使用了占位類型名字(通常此情況下用字母T
來表示)來代替實際類型名(如In
、String
或Doubl
)。占位類型名冇有提示T
必須是什麼類型,但是它提示了a
和b
必須是同一類型T
,而不管T
表示什麼類型。隻有swapTwoValues
函數在每次調用時所傳入的實際類型才能決定T
所代表的類型。
另外一個不同之處在於這個泛型函數名後麵跟著的展位類型名字(T)是用尖括號括起來的(<T>
)。這個尖括號告訴 Swift 那個T
是swapTwoValues
函數所定義的一個類型。因為T
是一個占位命名類型,Swift 不會去查找命名為T的實際類型。
swapTwoValues
函數除了要求傳入的兩個任何類型值是同一類型外,也可以作為swapTwoInts
函數被調用。每次swapTwoValues
被調用,T所代表的類型值都會傳給函數。
在下麵的兩個例子中,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"
注意
上麵定義的函數swapTwoValues
是受swap
函數啟發而實現的。swap
函數存在於 Swift 標準庫,並可以在其它類中任意使用。如果你在自己代碼中需要類似swapTwoValues
函數的功能,你可以使用已存在的交換函數swap
函數。