Swift4 协议
创建: 2018/02/27
完成: 2018/02/28
更新: 2018/03/07 增加类采用协议时的注意
补充只有类, 结构体, 枚举型可以采用协议
增加为类定义准备的协议( protocol Sample: class, ... { ... } )
【任务表】TODO
| 协议(protocol) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 协议 |
区分于具体的实现, 集中进行类型应该有的方法和属性的声明的功能 ● 应用某协议叫做采用协议 ● 只有类, 结构体, 枚举型可以采用协议 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 作为程序构成单位的协议 |
● 其他语言里叫协议(protocol)/接口(interface)/抽象类 ● 协议, 扩张, 泛型紧密相关 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 采用协议 |
采用协议的写法: struct/class 类型名: 协议名 { // 多个协议用逗号隔开
例 public protocol CustomStringConvertiable { // 固有的协议, 采用的可以直接作为文字参数, 如放到print里
● 可被构造体, 类采用 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 协议的声明 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 协议声明的概要 |
protocol 协议名: 继承的协议 { // 可以不继承
● 顺序不限,数量不限 ● 协议可以继承其他协议 协议里可以包含 ● 实例方法, 静态方法 ● 实例属性, 静态属性 ● 运算符的函数声明 ● 构造函数 ● 索引(subscript) ● 附属型(typealias, associatedtype), 不能在协议里自己定义新的型 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 类采用协议的注意 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 为类定义准备的协议 |
● 只有类, 结构体, 枚举型可以采用协议 ● 只运行类采用的协议定义方法 protocol 协议名: class, 继承的协议 { // 协议名后加上class
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 方法的声明与定义 |
● 改变自身的方法前面加mutating(类协议不需要) ● 只记声明,不写定义。可以在扩展里写定义作为默认的实现 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 属性的声明与定义 |
● 指定可读或者读写, get和set顺序不限, 只写声明 ● 指定为可读的可以实现为读写 ● 协议里都要写作var ● 计算型和容纳型都可以, 不限定 ● 静态属性前面加static |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 索引的声明与定义 |
和属性的声明与定义一样 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 作为型的协议 |
func 方法名(参数1: [协议], ...) -> 类型 {
● 只能执行协议声明的操作 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 协议的继承 |
protocol 协议: 继承的协议 {
● 逗号隔开 ● 实现方法自由 ● 不能有重名不同型的属性 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 协议的合成 |
协议1 & 协议2 ... // 几个已有协议的和集合, 不添加任何新东西 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 协议的例 | # TODO: Supply [使用协议的例子] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 协议与附属型 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 附属型的声明 |
associatedtype 附属型名 = 默认的型 ● 可以设定默认的型, 没有声明或者无法推导时使用自动判断为该型 ● 构造体, 类, 枚举型内部可以定义新型 ● 属于泛型, 型参数 ● 编译时候静态解析并替换为具体的型 ● 决定具体型的方法 // 以此协议为例 (a)用typealias给出具体型 struct Sample1: TestProtocol {
(b)定义型(内部嵌套的型)来给出定义 struct Sample2: TestProtocol {
(c)从型的使用方法来推导出型 struct Sample3: TestProtocol {
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Self |
● 表示采用该协议的型 ● 只能在协议和类中使用 在类中只能作为方法的返回值 ● 附属型的表达方法 Self.附属型名 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 向类型参数添加限制 |
● associatedtype A 没有任何限制 ● associatedtype A: 协议名 类型A必须采用右侧指定的协议, 多个用逗号,隔开 associatedtype SampleData: Equatable ● associatedtype A: 协议名 where 条件 多个协议的话where放在最后 类型A必须采用协议, 并且必须满足指定条件(多个条件用,隔开) 条件为 (1) 型: 协议 指定的型必须采用右侧协议 associatedtype SampleData: CustomStringConvertible where SampleData: Equatable (2) 型1 == 型2 型1, 型2同型 associatedtype SampleData: CustomStringConvertible where SampleData == String (3) 另外继承协议的话, 可以对其他协议的附属型做上述限制 protocol SampleProtocol: SampleParentProtocol, Equatable {
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 主要的协议 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
相等 Equatable |
public protocol Equatable {
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
大小关系 Comparable |
public protocol Comparable: Equatable {
● 只需要实现==和< ● 采用Comparable的可以使用sorted()来排序 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
表示序列 Sequence |
可以迭代的型(数组, 哈希表, 字符串等) Sequence协议定义的主要部分 public protocol Sequence {
IteratorProtocol public protocol IteratorProtocol {
● 只要自定义makeIterator()就可以采用 # TODO: Supply [创建采用Sequence的类型] ● 主要方法(数组, 哈希表, 字符串等都可以用), 不含带闭包的方法 # TODO: Supply [补充带闭包的参数 13.4] T: 元素的类型(Element), S: 采用Sequence的类型
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
可以用索引来获取元素 Collection |
可以用索引来获取元素的型(数组, 哈希表, 字符串) ● 继承Sequence ● Collection协议定义的主要部分 public protocol Collection: Sequence {
● associatedtype IndexDisrance = Int 指定默认型,没有声明且无法推导时候使用该型来作为IndexDisrance ● Index是索引的型,不一定是整数 ● 改变collection(改变内部元素)的方法(上面没写), 只有SubSequence和采用Collection的类型相同时才能用 ● 主要属性(数组, 哈希表, 字符串等) T: 元素的类型(Element), S: 采用Sequence的类型, Index: 索引的类型
● 主要方法(数组, 哈希表, 字符串等)
● 管理多个值的协议主要有(不是全部) Sequence <-- Collection <-- BidrectionalCollection <-- RangeReplaceableCollection <-- 其他... 实际开发时候基本上数组(Array)就够用了 # TODO: Supply [序列与闭包的组合, 使程序简洁 s13.4] |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 值型数据的共有 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Copy-On-Write |
● 写时复制, 平时数据交换是指针,只有在需要改写新处或者原处时复制一个新的来写 加快运行速度 ● 写时复制相对于直接写的好处是写失败不会对先前版本有影响 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 值型数据的共有 |
● Swift的值型数据使用Copy-On-Write ● 子列的也是Copy-On-Write Sequence, SubSequence SubSequence基本上和Sequence一样 String, SubString Array, ArraySlice 好处: ● 保留共有指针的高速 ● 防止了因为子列的参照而使得主列无法释放 因为不同型, 子列变到主列触发Copy机制, 子列与元主列不再被新变量参照 方针: 每次都变换拖慢运行速度,所以函数的参数, 返回值, 向属性代入等变换为主列 短期内部处理不用转换 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Swift4 协议的更多相关文章
- Swift4.0复习协议
1.协议的定义: /// 定义一个协议MyProt protocol MyProt { /// 声明了一个实例方法foo, /// 其类型为:() -> Void func foo() ...
- XCode10 swift4.2 适配遇到的坑
以下是2018年10月23日更新 经过大约一个月的时间的适配,项目正式使用XCode10(以下简称为10 or XC10)大部分库都升级为Swift4.2(以下简称为 4.2 or S4.2),下面是 ...
- Swift4 扩张(Extenstion), 集合(Set)
创建: 2018/03/09 完成: 2018/03/10 更新: 2018/04/19 修改小标题 [扩张的定义与使用协议] -> [通过扩张来采用协议] 更新: 2018/09/18 标题 ...
- Swift4 类与继承, 类型转换, 类型判断
创建: 2018/03/05 完成: 2018/03/07 更新: 2018/03/09 完善标题 [Swift4 类与继承, 类型转换] -> [Swift4 类与继承, 类型转换与判断] 补 ...
- Swift4 模式, 枚举型
创建: 2018/03/05 完成: 2018/03/05 更新: 2018/03/10 改变标题 [Swift4 模式] -> [Swift4 模式, 枚举型] 补充RawRepresenta ...
- Swift4.0复习特性、编译标志和检查API的可用性
1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...
- Swift4 - GCD的使用
Swift4 - GCD的使用 2018年03月30日 17:33:27 Longshihua 阅读数:1165 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
- HTTP协议系列(1)
一.为什么学习Http协议 首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...
- 重温Http协议--请求报文和响应报文
http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...
随机推荐
- 字符串常量与const常量内存区(——选自陈皓的博客)
1. 一个常见的考点: char* p = "test"; 那么理利用指针p来改变字符串test的内容都是错误的非法的. 例如: p[0] = 's'; strcpy(p, &qu ...
- 混合APP开发框架资料汇总
Ionic(ionicframework)一款接近原生的Html5移动App开发框架 会html css js就可以开发app,Ionic基于angualrjs框架是一个专注于开发移动wap以及app ...
- POJ 2104 K-th Number【整体二分 + 树状数组】
本来只是想学一下CDQ,还是先把整体二分搞懂一点. 这题窝几个月前分别用划分树,树套树,主席树和挑战上介绍的分桶法实现了一发(然而现在都忘得差不多了) 最快的是划分树,其次是主席树,然后是树套树,还有 ...
- 开头第一篇Hello World
以前在折腾个人博客的时候,使用过的WordpPress.Z-Blog.Typecho建站程序,开头第一篇都是Hello World,作为程序员的社区,开头第一篇当然也要是Hello World! 一句 ...
- Spring Boot使用Spring Data Redis操作Redis(单机/集群)
说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和 ...
- MySQL查询count(*)、count(1)、count(field)的区别收集
经过查询研究得出这个和MySQL中用什么引擎有关,比如InnoDB和MyISAM在处理这count(*).count(1).count(field)都有不同的方式,还有就是和版本都有关系,不同的版本会 ...
- 对CSS尺寸单位'em'的长期误解
一直以来认为'em'是相对于父元素的字体大小. 直到今天学习移动WEB开发,重新复习css的尺寸大小时,惊奇发现:对em深深的误解了!!! 在CSS官网对em的解释实例是: a. h1{line-he ...
- 深度学习综述(LeCun、Bengio和Hinton)
原文摘要:深度学习可以让那些拥有多个处理层的计算模型来学习具有多层次抽象的数据的表示.这些方法在很多方面都带来了显著的改善,包含最先进的语音识别.视觉对象识别.对象检測和很多其他领域,比如药物发现和基 ...
- [Angular] Modify User Provided UI with Angular Content Directives
If we’re going to make our toggle accessible, we’ll need to apply certain aria attributes to the con ...
- A Single Channel with Multiple Consumers RabbitMQ
http://stackoverflow.com/questions/30696351/a-single-channel-with-multiple-consumers-rabbitmq up vot ...