-
泛型所解決的問題
先來看幾個函數(shù):
func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a
a= b
b = temporaryA
}
func swapTwoStrings(_ a: inout String, _ b: inout String) { let temporaryA = a
a= b
b = temporaryA
}
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) { let temporaryA = a
a= b
b = temporaryA
}
上面三個函數(shù)的功能都是相同的祖驱,即交換兩個變量的值握恳,唯一不同之處就在于傳入的變量類型不同,分別是 Int
捺僻、 String
和 Double
乡洼。而實際應用中,為了實現(xiàn)相同的功能卻要實現(xiàn)多個函數(shù)匕坯,這顯然不是我們最想要的束昵,幸運的是,泛型代碼很好的解決了這個問題葛峻。
注意:
在上面三個函數(shù)中锹雏,a
和b
類型相同。如果a
和b
類型不同术奖,那它們倆就不能互換值礁遵。Swift
是類型安全的語言匿辩,所以它不允許一個String
類型的變量和一個Double
類型的變量互換值。試圖這樣做將導致編譯錯誤榛丢。
泛型代碼實現(xiàn):
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a= b
b = temporaryA
}
這個函數(shù)的泛型版本使用了占位類型名(在這里用字母 T
來表示)來代替實際類型名(例如 Int
铲球、String
或 Double
)。占位類型名沒有指明 T
必須是什么類型晰赞,但是它指明了 a
和 b
必須是同一類型 T
稼病,無論 T
代表什么類型。只有swapTwoValues(_:_:)
函數(shù)在調(diào)用時掖鱼,才能根據(jù)所傳入的實際類型決定 T
所代表的類型然走。
另外一個不同之處在于這個泛型函數(shù)名( swapTwoValues(_:_:)
)后面跟著占位類型名( T
),并用尖括號括起 來( <T>
)戏挡。這個尖括號告訴 Swift
那個 T
是 swapTwoValues(_:_:)
函數(shù)定義內(nèi)的一個占位類型名芍瑞,因此 Swift
不會去查找名為 T
的實際類型。