Swift3.0泛型的使用

Swift 有泛型,但是这次是为了引进新的特性,就像递归协议约束(使得受限的扩展遵循新协议的能力),比如遵循 Equatable的数组的元素也是遵循 Equatable的。先看个简单的

func makeArray(repeating item:  Item , numberOfTimes: Int  ) -> [Item] {
    var result = [Item]()
    for _ in 0..

运行结果:["knock","knock","knock","knock"]
因为泛型的缘故,使得makeArray函数可以支持很多数据类型

升级版,加入我们需要判断两个数组中是否有相同的元素,使用泛型应该如何写呢?首先应该要思考的问题如下:

  • 首先,既然需要判断两个元素相等,那么数组内的数据类型必须实现Equatable协议
  • 其次,两个数组内元素的数据类型必须一致,否则没有继续下去的必要
  • 最后,因为使用的是泛型,那未必是数组(上面说数组是为了便于表达_),但有一点是可以肯定的就是可以Iterator,否则无法取得其元素类型

第一步###

先按照最简单的思维,定义函数:

func hasSameElement(first a:A,another b:B){}

第二步###

既然是检测有没有相同测值,那可定需要将检测结果返回,于是修改如下:

func hasSameElement(first a:A,another b:B) -> Bool{
    return false
}

第三步###

增加条件约束:1:实现了Equatable,且比较的元素类型相同:

func hasSameElement(first a:A,another b:B) -> Bool where A.Iterator.Element:Equatable,A.Iterator.Element == B.Iterator.Element{
    return false
}

最后###

实现函数逻辑,即比较元素相等:

func hasSameElement(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
}

你可能感兴趣的:(Swift3.0泛型的使用)