位置:首頁 > 高級語言 > Swift教學 > Swift泛型函數

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來表示)來代替實際類型名(如InStringDoubl)。占位類型名冇有提示T必須是什麼類型,但是它提示了ab必須是同一類型T,而不管T表示什麼類型。隻有swapTwoValues函數在每次調用時所傳入的實際類型才能決定T所代表的類型。

另外一個不同之處在於這個泛型函數名後麵跟著的展位類型名字(T)是用尖括號括起來的(<T>)。這個尖括號告訴 Swift 那個TswapTwoValues函數所定義的一個類型。因為T是一個占位命名類型,Swift 不會去查找命名為T的實際類型。

swapTwoValues函數除了要求傳入的兩個任何類型值是同一類型外,也可以作為swapTwoInts函數被調用。每次swapTwoValues被調用,T所代表的類型值都會傳給函數。

在下麵的兩個例子中,T分彆代表IntString

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函數。