Swift 泛型參数
原文: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-listrequirement-clauseopt>
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 →
whererequirement-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
Swift 泛型參数的更多相关文章
- swift 可变參数
func sumof(numbers:Int...)->Int{ var sum = 0; for number in numbers{ sum+=number; } return ...
- 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数
1.指针数组 数组里面的每一个元素都是指针. 指针数组的案比例如以下: 易犯错误: 2.数组指针 归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来. 数组指针:(一个指针指向了数组.一般 ...
- 增强for循环、Map接口遍历、可变參数方法
增强for循环 1.for循环能做得事情.增强for循环大部分都能做(假设要想获得下标的时候就必须使用简单for循环了) 2.增强for有时候可以方便的处理集合遍历的问题,可是集合的标准遍历是使用迭代 ...
- Scala入门到精通——第十九节 隐式转换与隐式參数(二)
作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...
- Swift泛型协议的N种用法
They said "you should learn a new language every year," so I learned Swift. Now I learn ...
- java课堂练习之可变參数与卫条件
/* 有人邀请A,B,C,D,E,F 6个人參加一项会议,这6个人有些奇怪.由于他们有非常多要求,已知: 1)A,B两人至少有1人參加会议: 2)A,E,F 3人中有2人參加会议. 3)B和C ...
- 【Unity3D】【NGUI】怎样动态给EventDelegate加入參数
NGUI版本号:3.6.8 注意:參数必须是公共成员变量.不能是栈上的.或者私有的(就是暂时在函数里面定义的或者是函数的參数都不行) using UnityEngine; using System.C ...
- Lua学习教程之 可变參数数据打包与解包
利用table的pack与unpack进行数据打包与解包.測试代码例如以下: print("Test table.pack()----------------"); functio ...
- 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析
作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简单介绍 1. 状态保存方法演示 ...
随机推荐
- AC日记——[JSOI2007]建筑抢修 bzoj 1029
1029 思路: 贪心,而且,stl水过: 然而神特么输出que.size()就错! 代码: #include <queue> #include <cstdio> #inclu ...
- AC日记——Dynamic Problem Scoring codeforces 807d
Dynamic Problem Scoring 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <io ...
- Dart基础
dartpad在线调试 :https://dartpad.dartlang.org 运行需要用墙 vscode执行dart 安装 安装dart插件 下载安装dart 配置环境变量 vscode新建 ...
- AHOI2009中国象棋
首先以行为阶段,根据象棋的规则,在同一行中,至多只能有两个炮,同理:在同一列中,至多只能有两个炮思考一个可以覆盖整个状态空间的dp数组:dp[i]表示到了第i行接下来我们想:某列中的炮能否通过位运算求 ...
- Codeforces #445 Div2 D
#445 Div2 D 题意 给出一些字符串,要求构造一个最短的且字典序最小的字符串,使得给出的字符串都为目标字符串的子串,且这些字符串作为子串出现的次数都是最多的,如果不存在目标字符串输出 &quo ...
- [BZOJ 2743] 采花
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2743 Algorithm: 此题询问区间内出现次数超过1个的数字 明显在线做无从下手,无 ...
- Sublime | 编辑工具Sublime的使用小结
文章目录 Sublime Package & Usage MarkdownEditing MarkdownPreview Usage Key Bindings Setting (语法高亮和ma ...
- ubuntu下python3及idle3的安装
一.使用以下命令检查自己的系统下是否有python3 python3 --version 如果出现类似“command not found",则说明你需要安装python3.如果能够出现py ...
- ASP.NET MVC快速开发框架清新简洁界面设计,有兴趣可以模仿参考
软件的用户体验很重要,要抓住用户的心,这篇博文分享一下最近一个项目的UI设计. 我做UI设计是从用户的角度出发的,要去揣摩用户的习惯. 大部分用户都是使用windows操作系统,所以我这套软件的风格也 ...
- Ubuntu -- 安装和部署php5.6 nginx php5.6-fpm
1.首先输入用户名和密码进行登录 2.升级更新软件包 sudo apt-get update sudo apt-get upgrade 判断都填y 3.安装nginx sudo apt-get i ...