泛型


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


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. Java IO的RandomAccessFile的使用(转)

    现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”.可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实 ...

  2. Cocos2d-X中间应用

    (层)Laye:与球员打交道响应事件Node子类. 不同的场景,层通常包括直接在屏幕上呈现的内容.而且能够接受用户的输入事件.包括触摸,加速度计和键盘输入等. 我们须要在层中加入精灵,文本标签或者其它 ...

  3. SSL/TLS协议运行机制的概述(转)

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

  4. Java学习笔记——泛型

    假定T不仅要指定接口的类继承.使用下面的方式: public class some<T extends Iterable<T> & Comparable<T>&g ...

  5. Display Database Image using MS SQL Server 2008 Reporting Services

    原文 Display Database Image using MS SQL Server 2008 Reporting Services With the new release of MS SQL ...

  6. EL表达式语言

    EL (Expression Language) 目的:为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. ...

  7. Spark编译与部署

    Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建   [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.S ...

  8. bigdata_hadoop集群配置_内存分配

    haoop集群  做好内存管理跟重要,不然经常会给抛出个 OutMemory   ,内存溢出 以horntonworks给出推荐配置为样本,给出一种常见的Hadoop集群上各组件的内存分配方案.配置时 ...

  9. 国外android开源站点

    http://android-arsenal.com/

  10. Android4.4 Framework分析——startService创建过程

    我们经常使用context.startService()要启动service.下面就来分析这service启动过程,下图是service启动序列图: watermark/2/text/aHR0cDov ...