Swift 有泛型,但是這次是為了引進(jìn)新的特性,就像遞歸協(xié)議約束(使得受限的擴(kuò)展遵循新協(xié)議的能力),比如遵循 Equatable的數(shù)組的元素也是遵循 Equatable的。先看個(gè)簡(jiǎn)單的??
func makeArray<Item>(repeating item: Item , numberOfTimes: Int ) -> [Item] {
var result = [Item]()
for _ in 0..<numberOfTimes {
result.append(item)
}
return result
}
makeArray(repeating: "knock", numberOfTimes:4)
運(yùn)行結(jié)果:["knock","knock","knock","knock"]
因?yàn)榉盒偷木壒剩沟胢akeArray函數(shù)可以支持很多數(shù)據(jù)類型
升級(jí)版,加入我們需要判斷兩個(gè)數(shù)組中是否有相同的元素,使用泛型應(yīng)該如何寫呢?首先應(yīng)該要思考的問題如下:
- 首先,既然需要判斷兩個(gè)元素相等,那么數(shù)組內(nèi)的數(shù)據(jù)類型必須實(shí)現(xiàn)Equatable協(xié)議
- 其次,兩個(gè)數(shù)組內(nèi)元素的數(shù)據(jù)類型必須一致,否則沒有繼續(xù)下去的必要
- 最后,因?yàn)槭褂玫氖欠盒停俏幢厥菙?shù)組(上面說數(shù)組是為了便于表達(dá)_),但有一點(diǎn)是可以肯定的就是可以Iterator,否則無法取得其元素類型
第一步###
先按照最簡(jiǎn)單的思維,定義函數(shù):
func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B){}
第二步###
既然是檢測(cè)有沒有相同測(cè)值,那可定需要將檢測(cè)結(jié)果返回,于是修改如下:
func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B) -> Bool{
return false
}
第三步###
增加條件約束:1:實(shí)現(xiàn)了Equatable,且比較的元素類型相同:
func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B) -> Bool where A.Iterator.Element:Equatable,A.Iterator.Element == B.Iterator.Element{
return false
}
最后###
實(shí)現(xiàn)函數(shù)邏輯,即比較元素相等:
func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B) -> Bool where A.Iterator.Element:Equatable,A.Iterator.Element == B.Iterator.Element{
for a_e in a{
for b_e in b{
if a_e == b_e{
return true
}
}
}
return false
}