Swift 有泛型,但是这次是为了引进新的特性,就像递归协议约束(使得受限的扩展遵循新协议的能力),比如遵循 Equatable的数组的元素也是遵循 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)
运行结果:["knock","knock","knock","knock"]
因为泛型的缘故,使得makeArray函数可以支持很多数据类型
升级版,加入我们需要判断两个数组中是否有相同的元素,使用泛型应该如何写呢?首先应该要思考的问题如下:
- 首先,既然需要判断两个元素相等,那么数组内的数据类型必须实现Equatable协议
- 其次,两个数组内元素的数据类型必须一致,否则没有继续下去的必要
- 最后,因为使用的是泛型,那未必是数组(上面说数组是为了便于表达_),但有一点是可以肯定的就是可以Iterator,否则无法取得其元素类型
第一步###
先按照最简单的思维,定义函数:
func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B){}
第二步###
既然是检测有没有相同测值,那可定需要将检测结果返回,于是修改如下:
func hasSameElement<A:Sequence,B:Sequence>(first a:A,another b:B) -> Bool{
return false
}
第三步###
增加条件约束:1:实现了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
}
最后###
实现函数逻辑,即比较元素相等:
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
}