协议
语法
类、结构体、枚举都可遵循协议
1 | protocol SomeProtocol { |
类或结构体遵循协议
1 | struct SomeStructure: FirstProtocol, AnotherProtocol { |
对属性规定
协议可以规定其遵循者提供特定名称和类型的实例属性(instance property)或类属性(type property),而不用指定是存储型属性(stored property)还是计算型属性(calculate property)。此外还必须指明是只读的还是可读可写的。
1 | protocol SomeProtocol { |
对方法的规定
1 | protocol SomeProtocol { |
对 Mutating 方法的规定
结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。
1 |
|
对构造器的规定
1 | protocol SomeProtocol { |
协议构造器在类中的实现
1 |
|
1 | protocol SomeProtocol { |
协议类型
- 作为函数、方法或构造器中的参数类型或返回值类型
- 作为常量、变量或属性的类型
- 作为数组、字典或其他容器中的元素类型
扩展中添加协议成员
即便无法修改源代码,依然可以通过扩展(Extension)来扩充已存在类型(译者注: 类,结构体,枚举等)。扩展可以为已存在的类型添加属性,方法,下标脚本,协议等成员
通过扩展补充协议声明
当一个类型已经实现了协议中的所有要求,却没有声明为遵循该协议时,可以通过扩展(空的扩展体)来补充协议声明
协议继承
1 |
|
类专属协议
1 | protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol { |
协议合成
protocol <AProtocol, BProtocol>
可选协议
optional 方法
见Xcode
1 |
|
由于swift中的结构体、枚举等值类型可以遵守协议,而值类型不通过引用计数来管理内存,所以不能用weak这种ARC的概念来修饰。
解决方法 将协议声明为Objc的或者将协议声明为只能由类来实现。
协议扩展
使用扩展协议的方式为协议的遵循者提供方法或属性的实现。通过这种方式,可以让你无需在每个遵循者中都实现一次,无需使用全局函数,你可以通过扩展协议的方式进行定义。
如果遵循者自己实现了协议规定的方法,那么遵循者的实现方法将被使用。
为协议扩展添加限制条件
1 | extension CollectionType where Generator.Element : TextRepresentable { |