泛型


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


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

}

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

关联类型
官方的样例:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VwZXJnZXJt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VwZXJnZXJt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

由于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)。

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


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

swift 笔记 (二十) —— 泛型的更多相关文章

  1. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  2. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  3. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  4. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  5. python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法

    python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...

  6. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

  7. (C/C++学习笔记) 二十二. 标准模板库

    二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...

  8. (C/C++学习笔记) 二十. 文件和流

    二十. 文件和流 ● 文件的概念 文件(file) 一. C/C++语言将文件作为字节序列(sequence of characters)来对待,但从编码角度,或说从对字节信息的解释来看,文件分为:文 ...

  9. Java基础学习笔记二十五 MySQL

    MySQL 在dos中操作mysql 连接mysql命令: mysql -uroot -p密码 ,连接OK,会出现mysql> 对数据库的操作 创建一个库 create database 库名 ...

随机推荐

  1. Oracle 中用一个表的数据更新另一个表的数据

    Oracle 中用一个表的数据更新另一个表的数据 分类: SQL/PLSQL2012-05-04 15:49 4153人阅读 评论(1) 收藏 举报 oraclemergesubqueryinsert ...

  2. ASP.Net中上传文件的几种方法

    在做Web项目时,上传文件是经常会碰到的需求.ASP.Net的WebForm开发模式中,封装了FileUpload控件,可以方便的进行文件上传操作.但有时,你可能不希望使用ASP.Net中的服务器控件 ...

  3. [SignalR]异常信息捕获以及处理

    原文:[SignalR]异常信息捕获以及处理 异常处理,一般采用try..catch方式处理,而signalR里面有HubPipelineModule类可以捕获到Hub内发生的异常信息. 从上图中,可 ...

  4. 于PsIsSystemThread无论是在线程系统线程标识获得

    我一直好奇一个进程的所有线程改变线程标志Terminated mov edi, edi ; IoIsSystemThread push ebp mov ebp, esp mov eax, [ebp+a ...

  5. JavaEE(24) - JAAS开发安全的应用

    1. 安全域.角色和用户组 容器提供的两种安全性控制:声明式安全控制和编程式安全控制 安全域是指用户.用户组和ACL的逻辑集合.服务器支持的两种常用安全域:RDBMS安全域和文件系统安全域. 2. J ...

  6. hadoop 开始时间datanode一个错误 Problem connecting to server

    刚刚配置hadoop,namenode常开,但datanode但保留了错误.但不启动: 2014-05-04 10:43:33,970 WARNorg.apache.hadoop.hdfs.serve ...

  7. JavaScript中的各种奇葩问题

    原文:JavaScript中的各种奇葩问题 JavaScript浮点数 var a = (0.1 + 0.2) + 0.3; var b = 0.1 + (0.2 + 0.3); console.lo ...

  8. 错误 4 自定义工具错误: 无法生成服务引用“DepartMentService”的代码。请检查其他错

    原文:错误 4 自定义工具错误: 无法生成服务引用"DepartMentService"的代码.请检查其他错 问题:     错误 4 自定义工具错误: 无法生成服务引用" ...

  9. zoj3791(An Easy Game) DP

    意甲冠军:给定两个01弦s1,s2.每一个变化s1在m字 - 位.要求k制作步骤之后s1变s2有多少种方法. 解法:DP,关键是状态的设计.考虑还是唯一性和可传递性.dp[i][j]表示第i步后有j个 ...

  10. 开展project 正常的生活之路

    相对刚走出学校的学生在其他行业工作,竞争力的薪酬,同时.并不断地不仅学习更新专业知识让你感到生活的充实,更满足了你那不让外人知的虚荣心.在刚出校门的几年中,你常常回头看看被你落在后面的同学们,在内心怜 ...