Swift 有泛型,但是這次是為了引進新的特性辜王,就像遞歸協(xié)議約束(使得受限的擴展遵循新協(xié)議的能力)劈狐,比如遵循 Equatable的數(shù)組的元素也是遵循 Equatable的。先看個簡單的??
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)
運行結(jié)果:["knock","knock","knock","knock"]
因為泛型的緣故呐馆,使得makeArray函數(shù)可以支持很多數(shù)據(jù)類型
升級版肥缔,加入我們需要判斷兩個數(shù)組中是否有相同的元素,使用泛型應(yīng)該如何寫呢汹来?首先應(yīng)該要思考的問題如下:
- 首先续膳,既然需要判斷兩個元素相等改艇,那么數(shù)組內(nèi)的數(shù)據(jù)類型必須實現(xiàn)Equatable協(xié)議
- 其次,兩個數(shù)組內(nèi)元素的數(shù)據(jù)類型必須一致坟岔,否則沒有繼續(xù)下去的必要
- 最后谒兄,因為使用的是泛型,那未必是數(shù)組(上面說數(shù)組是為了便于表達_)社付,但有一點是可以肯定的就是可以Iterator承疲,否則無法取得其元素類型
第一步###
先按照最簡單的思維,定義函數(shù):
func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B){}
第二步###
既然是檢測有沒有相同測值鸥咖,那可定需要將檢測結(jié)果返回燕鸽,于是修改如下:
func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B) -> Bool{
return false
}
第三步###
增加條件約束:1:實現(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
}
最后###
實現(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
}