泛型


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


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. Atitit..文件上传组件选择and最佳实践的总结(2)----HTTP

    Atitit..文件上传组件选型and最佳实践总结(2)----断点续传 1. 断点续传的原理 1 2. 怎样推断一个插件/控件是否支持断点续传?? 1 3. 经常使用的组件选型结果::马 1 4.  ...

  2. Meld Diff for windows 安装和配置

    Meld Diff for windows 安装和配置 假设你在ubuntu 正在开发中, meld diff 此工具你肯定不会感到陌生. 而且很容易使用. 在网上看 meld for Windows ...

  3. ORA-12545: Connect failed because target host or object does not exist

    [oracle@ybdbtest oradata]$ sqlplus /nolog SQL*Plus: Release 9.2.0.4.0 - Production on Thu Jun 26 10: ...

  4. CSS hack方式

    史上最全的CSS hack方式一览   做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现 ...

  5. React组件开发入门

    React 组件开发入门 Introduction 本文组成: Ryan Clark文章Getting started with React的翻译. 博主的实践心得. React由Facebook的程 ...

  6. (大数据工程师学习路径)第一步 Linux 基础入门----数据流重定向

    介绍 开始对重定向这个概念感到些许陌生,但通过前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是重定向,将原本输出到标准输出的数 ...

  7. tomcat-jQ-springMVC-bootstrap

    基于tomcat-jQ-springMVC-bootstrap的公司产品管理WEB应用 管理员登录后台以后才能操作 ,权限管理只有一个管理员, 系统的主要作用是查看所有的 “公司列表”, 并查看该公司 ...

  8. Ubuntu设置交换空间參考教程[图]

    假设你当前使用的Ubuntu系统,不管是虚拟机还是实体机,没有交换分区或交换分区空间不足,能够为其设置交换空间. 本文提供的是一种设置交换空间的简单方法. 如若转载,请注明博文地址及原作者(Risin ...

  9. PHP图片等比缩放,并添加Logo水印特定代码和盯

    <? php //PHP图片等比缩放,并添加Logo水印 --->百度 "美日汇" /** * 等比缩放函数(以保存的方式实现) * @param string $pi ...

  10. C#:winform项目在win7,xp32位和64位都能执行

    vs中项目配置管理器活动解决方式平台选择X86平台.