Swift-协议
2021-07-01 本文已影响0人
MissSunRise
协议
![](https://img.haomeiwen.com/i3257736/1b6b08327f049f40.png)
![](https://img.haomeiwen.com/i3257736/6f78b0f273d6a31f.png)
设置协议后有自动补齐,而且是必实现,不然会报错的。
Static、class
为了保证类与结构体都能够使用,协议中必须用static定义类型方法、类型属性、类型下标
![](https://img.haomeiwen.com/i3257736/f3df0ec5c11881d7.png)
不为 static 会报错
mutating
协议中的实例方法需要使用mutating来修饰
![](https://img.haomeiwen.com/i3257736/2aaa67b11c9138da.png)
init
- 协议中还可以定义初始化器 init
- 非final类实现时必须加上required
![](https://img.haomeiwen.com/i3257736/9b85ced3e7e6307b.png)
![](https://img.haomeiwen.com/i3257736/8ac1a72dfbe848f8.png)
- 从协议实现的初始化器,刚好是重写了父类的指定初始化器
- 那么这个初始化必须同时加required、override
![](https://img.haomeiwen.com/i3257736/3a34d26beab005cb.png)
init、init?、init!
协议中定义的init?、init!,可以用init、init?、init!实现
协议中定义的init, 可以用init、init!去实现
![](https://img.haomeiwen.com/i3257736/d2791353b3777582.png)
协议的继承
一个协议可以继承其他协议(个人理解有点像分类)
![](https://img.haomeiwen.com/i3257736/4ea10212e617eca5.png)
协议组合
![](https://img.haomeiwen.com/i3257736/2b59b64a28dac25f.png)
同时遵守多种条件
![](https://img.haomeiwen.com/i3257736/04e62494d4cfeecc.png)
将协议写成变量的方式
CaseIterable
![](https://img.haomeiwen.com/i3257736/51e93b339c09ca3d.png)
让枚举遵守CaseIterable协议,可以实现遍历枚举值
CustomStringConvertible
![](https://img.haomeiwen.com/i3257736/e97d86f42b429f1e.png)
实现CustomStringConvertible协议后,print打印的函数为 description 的实现
实现CustomDebugStringConvertible协议后,debugPrint打印的函数为 debugDescription 的实现
X.self 、 X.Type 、 AnyClass
X.self是一个元类型(metadata)的指针,metadata存放着类型相关信息
X.self 属于X.Type类型
![](https://img.haomeiwen.com/i3257736/9d08d162823f5bb1.png)
![](https://img.haomeiwen.com/i3257736/eb4438966611a0d2.png)
定义一种type
![](https://img.haomeiwen.com/i3257736/3d4b55e44aaeaf59.png)
AnyClass等于AnyObject.Type 包含了所有类型
![](https://img.haomeiwen.com/i3257736/07f4b3e969054e2f.png)
type(of: per) 等同于Person.self
看似是一个函数,但是不会使用到栈,说明进行了优化。
元类型的应用
![](https://img.haomeiwen.com/i3257736/c47e21360318de0f.png)
AnyObject.Self 等价于 [AnyObject class]
使用场景,让不同类型做相同的事情
或者为不知道的类型留下操作空间
![](https://img.haomeiwen.com/i3257736/8ad27923ad734f1c.png)
Swift同样可以使用Runtime的一些方法
如果一个Swift类,没有继承其他类,这个类就被叫做 base类
但是其实在底层实现下,base类也是有父类的:SwiftObject
很容易理解,编译器为了满足公共方法,肯定是有一个公共类的