泛型能根據(jù)自定義的需求編寫出使用于任意類型的锦聊、靈活可復(fù)用的函數(shù)及類型业踢。它能夠避免讓你編寫重復(fù)的代碼根竿,用一種更清晰和抽象的方式來(lái)表達(dá)代碼的意圖。
例如:siwift 中的以數(shù)組(Array)和 字典(Dictionary)他們都是泛型的集合代表猖任。它們?cè)谑褂玫倪^(guò)程中元素可以是Int類型你稚、String類型等等,如果不使用泛型我們可能需要每次都得寫一個(gè)針對(duì)你所需要的方法朱躺。但是使用了泛型不用寫重復(fù)的代碼刁赖。代碼如下:
1、假設(shè)我們需要交換兩個(gè)Int類型
的值长搀,所以就定義了下邊的方法宇弛。(非泛型例子)
func swapTwoInts(_ a: inout Int,_ b: inout Int){
let temporaryA = a
a = b
b = temporaryA
}
2、后來(lái)又需要把兩個(gè)String類型
的值進(jìn)行交換源请,所以就又定義了下邊的方法枪芒。(非泛型例子)
func swapTwoString(_ a: inout String,_ b: inout String){
let temporaryA = a
a = b
b = temporaryA
}
3轿钠、如果按照這樣推算是不是所需要傳入的參數(shù)一發(fā)生變化就得寫一個(gè)方法嗎?那不是寫了很多重復(fù)的代碼嗎病苗?所以用泛型簡(jiǎn)化一下吧。(泛型例子)
#這里的下劃線_是把參數(shù)名稱個(gè)忽略了症汹。
func swapTwoValues<T>(_ a: inout T,_ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
4硫朦、泛型在使用時(shí)候需要注意事項(xiàng)。
就拿上邊的泛型例子來(lái)講背镇,使用的時(shí)候參數(shù)必須是同一個(gè)類型的咬展,否則你傳不同的兩個(gè)類型是會(huì)報(bào)錯(cuò)的。因?yàn)榉盒涂梢宰远ㄍ茢囝愋汀?/p>
正確的使用瞒斩,參數(shù)類型是一樣的:
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
錯(cuò)誤的使用如下:
var someInt = 3
var anotherString = "world"
swapTwoValues(&someInt, &anotherString)
注釋:
上邊的例子會(huì)報(bào)錯(cuò)Cannot convert value of type 'String' to expected argument type 'Int'
5破婆、最后總結(jié)
1.采用了泛型的函數(shù)使用
T
占位符來(lái)進(jìn)行占位。使用方式是后綴添加<T>
胸囱。
2.方法參數(shù)可以接受任意類型的值但是必須是相同類型的值
祷舀。
3.參數(shù)使用inout
修飾的時(shí)候在調(diào)用的時(shí)候必須在參數(shù)前邊加&
。