swift 笔记 (二十) —— 泛型

泛型

泛型是为了解决在针对不同数据类型。而做了同一种功能的操作导致的每一个类型我们都要写一份代码的问题。 有了泛型,我们能够仅仅写一份逻辑代码,而适应于不同的数据类型。


func swapInt(inout num1:Int, inout num2: Int) {
     var tmp = num1
     num1 = num2
     num2 = tmp
}

func swapDouble(inout num1: Double, inout num2:Double) {
     var tmp = num1
     num1 = num2
     num2 = tmp 
}

上面两个函数的功能,全然一样,不过数据类型的不同。

所以这样的问题,我们能够用泛型来解决:

func swap<T>(inout num1:T, inout num2: T)  {
     var tmp = num1
     num1 = num2
     num2 = tmp 
}

如今仅仅要使用swap这个函数,两个參数的类型同样,就能够交换两个变量的值了。

早些时候,我们已经见过:
var myArray:Array<Int> = [1,2,3,4]
这种写法了。Array就是个泛型的struct版本号,而<>中指定的是我们须要往Array中存放的是什么数据类型。这就是泛型的一种特化方式。


类型约束
有时候。我们须要为泛型的參数做个过滤,有一些參数不准传入。有一些能够。

我们就能够通过类型约束来达到这个目的。

<T: 约束>

func isTheSameValue<T: Equatable>(value1: T, value2: T) -> Bool {
    
return value1 == value2
}


全部的支持 == 操作符的类型,都能够当做參数传入。

关联类型
官方的样例:


typealias定义了一个关联类型 ItemType,和三个要求(一个append方法,一个count属性,一个下标)。
协议的实现:


由于swift是会自己主动推导类型的,所以,这里的typealias ItemType = Int事实上是能够省略的。
假设我们须要让一个已经存在的类也符合这个关联类型,而。这个类,又恰好已经遵循了这个协议,我们就能够留个空扩展,让它满足我们的需求:
extension Array: Containner {}

这样就能够将不论什么Array当作是Containner来使用了。

Where 语句

官方的样例:


where语句写在泛型的类型參数列表中。以约束两个以上的类型。据有某些共同特质,才干够传入allItemsMatch这个函数。

这个where语句描写叙述的要求是:
C1 C2 是两个參数的类型,他们都遵循Container约束。C1的ItemType与C2的ItemType必须同样,而且C1的Itemtype是遵循Equatable协议的(既然C2的ItemType与C1的ItemType必须同样。所以这里不必再单独写个C2的ItemType也符合Equatable)。

函数体就不解释了。当然,可以理解。


版权声明:本文博客原创文章,博客,未经同意,不得转载。

posted @ 2015-07-09 15:25  mengfanrong  阅读(186)  评论(0编辑  收藏  举报