Swift4 扩张(Extenstion), 集合(Set)
创建: 2018/03/09
完成: 2018/03/10
更新: 2018/04/19 修改小标题 [扩张的定义与使用协议] -> [通过扩张来采用协议]
更新: 2018/09/18 标题里增加英文方面自己快速找到 [Swift4 扩张, 集合] -> [Swift4 扩张(Extenstion), 集合(Set)]
| 扩张的声明与定义 | |||||||||||||||||||||||||||||||||||||||||||||
| 扩张的概要 |
可以对类, 构造体(系统固有的数据类型都算), 枚举型, 协议进行扩张 extension 型名: 协议 { // 协议可省略, 顺序随意
● 可以增加以下新定义 (●) 计算型属性, 计算型和容纳型静态属性(类属性) 即除容纳型实例属性外的属性 (●) 实例方法, 静态方法(类犯法) (●) 构造函数 (●) 索引subscript (●) 嵌套型声明(嵌套型在扩张定义内部用) ● 不可增加计算型实例属性, 属性监听器({willset didset}) |
||||||||||||||||||||||||||||||||||||||||||||
| 系统固有型的扩张例 |
extension String {
|
||||||||||||||||||||||||||||||||||||||||||||
| 扩张的定义与构造函数 |
扩张与构造函数 ● 构造体: 扩张定义的构造函数不会使构造体的默认构造函数和全项目构造函数无效 ● 类 扩张只能定义简易构造函数(带convenience), 不能定义指定构造函数 不能定义析构函数 |
||||||||||||||||||||||||||||||||||||||||||||
| 扩张定义与继承的注意 |
● 扩张的东西都自带final 无法被子类重载 ● 不能用扩张去重载父类属性/方法 |
||||||||||||||||||||||||||||||||||||||||||||
| 通过扩张来采用协议 | |||||||||||||||||||||||||||||||||||||||||||||
| 使用扩张来采用协议 |
class ExtensionSampleClass { // 什么都没有的空类
}
● 同时采用多个时用,隔开 extension SampleDataType: Protocol1, Protocol2, ... { // 多个用,隔开
|
||||||||||||||||||||||||||||||||||||||||||||
| 型内已有一部分/全部不定义 |
型内已有要采用的协议的一部分或全部定义时, 扩张里只需要补充缺少的. 不能改写型定义里已存在的 //内部已有一部分或全部实现 |
||||||||||||||||||||||||||||||||||||||||||||
| 协议的扩张 | |||||||||||||||||||||||||||||||||||||||||||||
| 协议的扩张 |
● 可以写方法, 计算型属性, 索引subscript ● 不可以写协议里的那种声明, 和容纳型实例/静态变量 ● 主要只要协议里东西的实现, 做默认实现 ● 改写默认实现不需要override |
||||||||||||||||||||||||||||||||||||||||||||
| 标准库的协议已有的扩张 |
例 public protocol Equatable { // 可等协议
|
||||||||||||||||||||||||||||||||||||||||||||
| 协议扩张时对型附加条件 |
对协议扩张时才能附加条件 ● 可附加的条件: 附属型: 协议 表示附属型必须采用指定协议 附属型 == 型 附属型必须是指定的型(可以是typealias后的) protocol SampleProtocol { // 样本协议
|
||||||||||||||||||||||||||||||||||||||||||||
| 协议扩张的多重继承 |
● 同时采用多个协议时不能有重名属性或方法 ● 相当于其他语言的mixin, trait |
||||||||||||||||||||||||||||||||||||||||||||
| 集合与协议 | |||||||||||||||||||||||||||||||||||||||||||||
| 通过哈希值实现高速搜索 |
● 集合和数组类似, 但不能有重复 ● 集合用于不需要重复元素或者需要使用集合运算的情况 ● 采用Hashable协议 public protocol Hashable: Equatable { // 继承Equatable, 需要实现==
|
||||||||||||||||||||||||||||||||||||||||||||
| 集合的声明与初始化 |
声明 var s: Set<类型> 初始化, 用数组, 有重复元素自动清除多余的 let setSample: Set<String> = ["a", "a", "b"] 也可以用init Set<Int>.init() // [] |
||||||||||||||||||||||||||||||||||||||||||||
| 元素的获取 |
和数组, 哈希表, 字符串一样采用Collection(继承Sequence) 参照: 传送门 |
||||||||||||||||||||||||||||||||||||||||||||
| 集合运算 |
前提: 元素同型 ● 采用SetAlgebra(继承Equatable, ExpressibleByArrayLiteral) ● 主要构造函数
● 主要属性
● 主要方法 S: sequence, 集合, 数组, 范围等 T: Set<T>的T
|
||||||||||||||||||||||||||||||||||||||||||||
| OptionSet协议 |
OptionSet协议 protocol OptionSet: SetAlgebra, RawRepresentation {
RawRepresentable协议 protocol RawRepresentable {
OptionSet的扩张(一部分) extension OptionSet {
● 要想使用默认实现, 只需定义RawValue型为Int, UInt等 并放一个rawValue属性 ● 不带任何选项的实例推荐用[]来生成 ● 用法: 放置选项, 相当于C, ObjC的比特列放置选项 可以去查看是否包含某选项, 是否包含某些选项等 struct SampleOptionSet: OptionSet { // 例, 四个选项optionA, B, C, D
|
||||||||||||||||||||||||||||||||||||||||||||
Swift4 扩张(Extenstion), 集合(Set)的更多相关文章
- Redis底层探秘(四):整数集合及压缩列表
整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含 整数值元素,并且这个集合的元素数量不多时,Redis就会使用郑书记和作为集合键的底层实现. 整数集合的实现 整数集合是red ...
- Java集合---ArrayList的实现原理
目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除 6) 调整数组容量 ...
- ArrayList集合的实现原理
一. ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境 ...
- 重新开始学习javase_集合_List
一,List之ArrayList(转:http://blog.csdn.net/zheng0518/article/details/42198205) 1. ArrayList概述: ArrayLis ...
- Java集合ArrayList源码解读
最近在回顾数据结构,想到JDK这样好的代码资源不利用有点可惜,这是第一篇,花了心思.篇幅有点长,希望想看的朋友认真看下去,提出宝贵的意见. :) 内部原理 ArrayList 的3个字段 priva ...
- ava集合---ArrayList的实现原理
一.ArrayList概述 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存 ArrayList不是线程安全的,只能用在单线程环境下,多 ...
- Java多线程 阻塞队列和并发集合
转载:大关的博客 Java多线程 阻塞队列和并发集合 本章主要探讨在多线程程序中与集合相关的内容.在多线程程序中,如果使用普通集合往往会造成数据错误,甚至造成程序崩溃.Java为多线程专门提供了特有的 ...
- Java集合:ArrayList的实现原理
Java集合---ArrayList的实现原理 目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除 ...
- JDK源码学习之 集合实现类
一.HashMap (1) 简介:java1.8版本之前HashMap的结构图如下: 数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单 ...
随机推荐
- Codeforces 938G(cdq分治+可撤销并查集+线性基)
题意: 有一个无向连通图,支持三个操作: 1 x y d : 新建一条x和y的无向边,长度为d 2 x y :删除x和y之间的无向边 3 x y :询问x到y的所有路径中(可以绕环)最短的 ...
- git获取远程分支
运行 git checkout -b local-branchname origin/remote_branchname 就可以将远程分支映射到本地命名为local-branchname 的一分支 ...
- Docker+Drone做Java/Tomcat的CI服务
1. 安装Docker(略过) 2. 编写docker-compose.yaml version: '2' services: drone-server: image: drone/drone:0.8 ...
- 【Nginx】发送响应
请求处理完毕后,需要向用户发送http响应,告知客户端Nginx的执行结果.http响应主要包括响应行.响应头部.包体三部分.发送http响应时需要执行发送http头部(发送http头部时也会发送响应 ...
- Office PDF如何批量删除书签
网上下了本PDF,不知道哪个傻逼每一页都做了一个书签,我真的想做个书签,看看自己做到哪一页都被搞乱了.狗日的,还没有批量删除功能. 方法就是,你定位到任意一个书签,然后按住Delete键,然后就可 ...
- 让你的 EditText 所有清除
原文地址:让你的 EditText 所有清除 參考原文:Giving your Edit Texts the All Clear 项目地址(欢迎 Star):ClearEditText 在输入文本的时 ...
- 奥斯卡·王尔德十大经典语录
10不够真诚是危急的,太真诚则绝对是致命的.--摘自<身为艺术家的评论者> "A little sincerity is a dangerous thing, and a gre ...
- C#中泛型方法与泛型接口 C#泛型接口 List<IAll> arssr = new List<IAll>(); interface IPerson<T> c# List<接口>小技巧 泛型接口协变逆变的几个问题
http://blog.csdn.net/aladdinty/article/details/3486532 using System; using System.Collections.Generi ...
- 手机阅读行业SWOT分析
上个星期,在公司内部的分享活动上给童鞋们分享了手机阅读行业现状,小伙伴儿们嗷嗷待哺的眼神促使我把PPT转换为博客里的文字和图片,再一次更加深入地进入手机阅读. 通过SWOT分析分析我们能够对手机阅读行 ...
- C# MVC 枚举转 SelectListItem
<span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: r ...