Swift-协议(Protocol)
定义
- 协议可以用来定义方法、属性、下标的声明,协议可以被枚举、结构体、类遵守(多个协议之间用逗号隔开)
1 | protocol Drawable { |
- 协议中定义方法时不能有默认参数值
- 默认情况下,协议中定义的内容必须全部都实现
- 也有办法办到只实现部分内容,后面会体现
协议中的属性
1 | protocol Drawable { |
static, class
- 为了保证通用,协议中必须用static定义类型方法、类型属性、类型下标
1 | protocol Drawable { |
mutating
- 只有将协议中的实例方法标记为
mutating- 才允许结构体、枚举的具体实现修改自身内存
- 类在实现方法时不用加
mutating,枚举、结构体才需要添加mutating
1 | protocol Drawable { |
init
- 协议中还可以定义初始化器init
- 非final类实现时必须加上required
1 | protocol Drawable { |
- 如果从协议实现的初始化器,刚好是重写了父类的指定初始化器
- 那么这个初始化必须同时加上required, override
1 | protocol Livable { |
init、init?、init!
- 协议中定义的init?、init!,可以用init、init?、init!去实现
- 协议中定义的init,可以用init、init!去实现
1 | protocol Livable { |
协议的继承
- 一个协议可以继承其他协议
1 | protocol Runnable { |
协议组合
- 协议组合,可以包含1个类类型(最多1个)
1 | protocol Livable {} |
CaseIterable
- 让枚举遵守CaseIterable协议,可以实现遍历枚举值
1 | enum Season : CaseIterable { |
CustomStringConvertible
- 遵守
CustomStringConvertible、CustomDebugStringConvertible协议,都可以自定义实例的打印字符串
1 | class Person : CustomStringConvertible, CustomDebugStringConvertible { |
- print调用的是CustomStringConvertible协议的description
- debugPrint、po调用的是CustomDebugStringConvertible协议的debugDescription
Any、AnyObject
- Swift提供了2种特殊的类型:Any、AnyObject
- Any:可以代表任意类型(枚举、结构体、类,也包括函数类型)
- AnyObject:可以代表任意类类型(在协议后面写上:AnyObject代表只有类能遵守这个协议)
- 在协议后面写上: class也代表只有类能遵守这个协议
1 | var stu: Any = 10 |
is、as?、as!、as
- is用来判断是否为某种类型,as用来做强制类型转换
1 | protocol Runnable { func run() } |
X.self、X.Type、AnyClass
- X.self是一个元类型(metadata)的指针,metadata存放着类型相关信息
- X.self属于X.Type类型
1 | class Person {} |
元类型的应用
1 | class Animal { required init() {} } |
- 从以下结果可以看得出来,Swift还有个隐藏的基类:Swift._SwiftObject
- 可以参考Swift源码:https://github.com/apple/swift/blob/master/stdlib/public/runtime/SwiftObject.h
1 | import Foundation |
Self
Self一般用作返回值类型,限定返回值跟方法调用者必须是同一类型(也可以作为参数类型)
1 | protocol Runnable { |
参考
李明杰老师课件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ivan's Blog!
评论









