原文:http://www.cocoachina.com/newbie/basic/2014/0612/8802.html

本页内容包含:泛型形參语句和泛型实參语句

本节涉及泛型类型、泛型函数以及泛型构造器的參数,包含形參和实參。声明泛型类型、函数或构造器时,须指定对应的类型參数。类型參数相当于一个占位符,当实例化泛型类型、调用泛型函数或泛型构造器时,就用详细的类型实參替代之。

关于 Swift 语言的泛型概述,见泛型(第二部分第22章)。

泛型形參语句


泛型形參语句指定泛型类型或函数的类型形參,以及这些參数的关联约束和要求。泛型形參语句用尖括号(<>)包住,而且有下面两种形式:

泛型形參列表中泛型形參用逗号分开,每个採用下面形式:

泛型形參由两部分组成:类型形參及其后的可选约束。类型形參仅仅是占位符类型(如T,U,V,KeyType,ValueType等)的名字而已。你能够在泛型类型、函数的其余部分或者构造器声明,以及函数或构造器的签名中使用它。

约束用于指明该类型形參继承自某个类或者遵守某个协议或协议的一部分。比如,在以下的泛型中,泛型形參T: Comparable表示不论什么用于替代类型形參T的类型实參必须满足Comparable协议。

func simpleMin<T: Comparable>(x: T, y: T) -> T {     if x < y {         return y     }     return x }

如,Int和Double均满足Comparable协议,该函数接受不论什么一种类型。与泛型类型相反,调用泛型函数或构造器时不须要指定泛型实參语句。类型实參由传递给函数或构造器的实參判断而出。

simpleMin(17, 42) // T is inferred to be Int simpleMin(3.14159, 2.71828) // T is inferred to be Double

Where语句


要想对类型形參及其关联类型指定额外要求,能够在泛型形參列表之后加入where语句。where语句由keywordwhere及其后的用逗号切割的多个要求组成。

where语句中的要求用于指明该类型形參继承自某个类或遵守某个协议或协议的一部分。虽然where语句有助于表达类型形參上的简单约束(如T: Comparable等同于T where T: Comparable,等等),可是依旧能够用来对类型形參及其关联约束提供更复杂的约束。如,<T where T: C, T: P>表示泛型类型T继承自类C且遵守协议P。

如上所述,能够强制约束类型形參的关联类型遵守某个协议。<T: Generator where T.Element: Equatable>表示T遵守Generator协议,并且T的关联类型T.Element遵守Eauatable协议(T有关联类型是由于Generator声明了Element,而T遵守Generator协议)。

也能够用操作符==来指定两个类型等效的要求。比如,有这样一个约束:T和U遵守Generator协议,同一时候要求它们的关联类型等同,能够这样来表达:<T: Generator, U: Generator where T.Element == U.Element>。

当然,替代类型形參的类型实參必须满足全部类型形參所要求的约束和要求。

泛型函数或构造器能够重载,但在泛型形參语句中的类型形參必须有不同的约束或要求,抑或二者皆不同。当调用重载的泛型函数或构造器时,编译器会用这些约束来决定调用哪个重载函数或构造器。

泛型类能够生成一个子类,可是这个子类也必须是泛型类。

GRAMMAR OF A GENERIC PARAMETER CLAUSE

generic-parameter-clause → generic-parameter-list­requirement-clause­opt­

generic-parameter-list → generic-parameter­  generic-parameter­generic-parameter-list­

generic-parameter → type-name­

generic-parameter → type-name­type-identifier­

generic-parameter → type-name­protocol-composition-type­

requirement-clause → where­requirement-list­

requirement-list → requirement­  requirement­requirement-list­

requirement → conformance-requirement­  same-type-requirement­

conformance-requirement → type-identifier­type-identifier­

conformance-requirement → type-identifier­protocol-composition-type­

same-type-requirement → type-identifier­==­type-identifier­

泛型实參语句


泛型实參语句指定泛型类型的类型实參。泛型实參语句用尖括号(<>)包住,形式例如以下:

泛型实參列表中类型实參有逗号分开。类型实參是实际详细类型的名字,用来替代泛型类型的泛型形參语句中的对应的类型形參。从而得到泛型类型的一个特化版本号。如,Swift标准库的泛型字典类型定义例如以下:

struct Dictionary<KeyType: Hashable, ValueType>: Collection, DictionaryLiteralConvertible {     /* ... */ }

泛型Dictionary类型的特化版本号,Dictionary<String, Int>就是用详细的String和Int类型替代泛型类型KeyType: Hashable和ValueType产生的。每个类型实參必须满足它所替代的泛型形參的全部约束,包含不论什么where语句所指定的额外的要求。上面的样例中,类型形參KeyType要求满足Hashable协议,因此String也必须满足Hashable协议。

能够用本身就是泛型类型的特化版本号的类型实參替代类型形參(如果已满足合适的约束和要求)。比如,为了生成一个元素类型是整型数组的数组,能够用数组的特化版本号Array<Int>替代泛型类型Array<T>的类型形參T来实现。

let arrayOfArrays: Array<Array<Int>> = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

如泛型形參语句所述,不能用泛型实參语句来指定泛型函数或构造器的类型实參。

泛型实參语法:

generic-argument-clause → generic-argument-list­

generic-argument-list → generic-argument­  generic-argument­generic-argument-list­

generic-argument → type


转载于:https://www.cnblogs.com/gcczhongduan/p/4005007.html

Swift 泛型參数相关推荐

  1. swift 可变參数

    func sumof(numbers:Int...)->Int{  var sum = 0;  for number in numbers{   sum+=number;  }  return ...

  2. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数...

     1.指针数组 数组里面的每一个元素都是指针. 指针数组的案比例如以下: 易犯错误: 2.数组指针 归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来. 数组指针:(一个指针指向了数组.一般 ...

  3. 增强for循环、Map接口遍历、可变參数方法

    增强for循环 1.for循环能做得事情.增强for循环大部分都能做(假设要想获得下标的时候就必须使用简单for循环了) 2.增强for有时候可以方便的处理集合遍历的问题,可是集合的标准遍历是使用迭代 ...

  4. Swift 泛型教程入门

    原文:Swift Generics Tutorial: Getting Started 作者:Gemma Barlow 译者:kmyhy 更新说明:本教程由 Gemma Barlow 更新为 Swif ...

  5. 具体解释可变參数列表

    可变參数   至少有一个參数 比如:void add(int a,- ){} 例题  模拟printf()函数 #include <stdio.h> #include <stdarg ...

  6. 使用JDBC改变Oracle的session參数 NLS_DATE_FORMAT

    近期项目除了一个问题,场景大概是这种,项目在国外开发.在项目开发过程中使用了大量的Oracle函数TO_DATE,可是开发者没有写第二个參数. 所以项目在国外的server上能够正常执行.但是在国内的 ...

  7. C# 多线程參数传递

    1.通过实体类来传递(能够传递多个參数与获取返回值),demo例如以下: 须要在线程中调用的函数: namespace ThreadParameterDemo {public class Functi ...

  8. TVS參数具体解释及选型应用

    一.首先了解TVS管的參数,我们以littelfuse的5.0SMDJ系列为例. 图1 图2 最大峰值脉冲功率 Maximum Peak Pulse Power Pppm峰值脉冲功率为ESD器件上瞬间 ...

  9. JVM经常使用的调优參数

    -Xms512m -Xmx1024m -XX:MaxPermSize=1204m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+ ...

最新文章

  1. MySQL 数据库linux系统下修改配置文件设置mysql是否大小写敏感实例演示
  2. 去掉PE文件随机基址的方法
  3. 汇编中断知识之INT 1CH
  4. Java 冒泡排序的实现
  5. PHP 如何判断当前用户已在别处登录
  6. javascript简易缓动插件
  7. python 成员运算符_Python的“ in”和“ not in”成员资格运算符
  8. DevExpress DXperience 的本地化(汉化)方法
  9. 证明同步函数使用的this锁
  10. C++ 二维数组指针遍历
  11. Windows 10 21H1 官方正式版下载
  12. 计算机时间与网络时间无法同步,终于解决了本地计算机时间无法与Internet时间服务器同步的难题...
  13. win7安装网络打印机显示windows无法连接到打印机,出现错误0x00000bcb
  14. 大脑分区与功能简介汇总
  15. sed命令删除行操作
  16. oracle bulk collect into,BULK COLLECT INTO
  17. linux时间变成英文,查看/修改Linux时区和时间
  18. 10款最佳的Linux文件比较工具
  19. java “错误:编码GBK 的不可映射字符”
  20. 菜鸟后端开发之时间查询

热门文章

  1. 【Linux】一步一步学Linux——chown命令(112)
  2. java 2d 绘图教程_Java标准教程:Java 2D绘图--第2章 从绘图开始
  3. 地址总线是单向还是双向_三端双向交流开关(TRIAC)
  4. Codeforces 988E. Divisibility by 25
  5. 从QQ进程内存中搜索出QQ号码
  6. DLL回调EXE里的函数
  7. idea-jvm参数设置(有注释)
  8. ARM的流水线与PC值的关系
  9. perl--模块安装方法和常用模块
  10. 报错:“-bash: git: 未找到命令”