1.协议
-
协议的语法:
-
定义协议
-
遵守协议:在类型名称后面,加上协议名称,用
:
隔开,协议之间用,
隔开 -
继承父类的子类的时候,应该把父类写在协议前面,
protocol SomeProtocol {} class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {} 复制代码
-
属性要求
-
协议中定义了属性,遵守该协议的实例或类型,必须有这个属性
-
协议的中定义属性,只指定属性的名称和类型,还指定属性的可读性,可写性,
-
方法要求
-
和普通方法一样,但不需要{} 和方法体,方法的参数列表也不支持默认值
-
Mutating 方法要求
-
如果你在协议中定义了一个实例方法,该方法会改变遵循该协议的类型的实例,那么在定义协议时需要在方法前加 mutating 关键字。这使得结构体和枚举能够遵循此协议并满足此方法要求。
-
构造器要求
-
协议可以要求遵循协议的类型实现指定的构造器。你可以像编写普通构造器那样,在协议的定义里写下构造器的声明,但不需要写花括号和构造器的实体
-
实现的时候,遵守代理的构造器方法需要加上关键字
required
-
如果一个类是定义了
final
,不需要在写required,因为不会有子类,final是为了防止重写 -
如果子类重写了父类的指定构造器,并且指定构造器遵循了某个协议,该方法同时需要写关键字
required
和overri
-
协议作为类型
class Dice { let sides: Int let generator: RandomNumberGenerator init(sides: Int, generator: RandomNumberGenerator) { self.sides = sides self.generator = generator } func roll() -> Int { return Int(generator.random() * Double(sides)) + 1 } } 复制代码
-
Dice 类提供了一个名为 roll 的实例方法,用来模拟骰子的面值。它先调用 generator 的 random() 方法来生成一个 [0.0,1.0) 区间内的随机数,然后使用这个随机数生成正确的骰子面值。因为 generator 遵循了 RandomNumberGenerator 协议,可以确保它有个 random() 方法可供调用
2.委托(代理)模式
-
protocol - delegate
3.通过扩展添加协议一致性,通过扩展遵循协议
- 当一个类型已经符合了某个协议中的所有要求,却还没有声明遵循该协议时,可以通过空扩展体的扩展来遵循该协议:
4.协议类型的集合,协议的继承
-
协议能够继承一个或多个其他协议,可以在继承的协议的基础上增加新的要求
-
例子中定义了一个新的协议 PrettyTextRepresentable,它继承自 TextRepresentable 协议。任何遵循 PrettyTextRepresentable 协议的类型在满足该协议的要求时,也必须满足 TextRepresentable 协议的要求
5.类类型专属协议
-
只适用一某种类型
6.协议合成
-
有时候需要同时遵循多个协议,你可以将多个协议采用 SomeProtocol & AnotherProtocol 这样的格式进行组合,称为 协议合成(protocol composition)。你可以罗列任意多个你想要遵循的协议,以与符号(&)分隔。
7.检查协议一致性
-
Circle,Country,遵守了HasArea协议,协议中有只读的area属性
-
Animal 没有遵守HasArea协议
-
上面三个各自实例,判断是不是符合某个协议的,使用
as?
, 返回可选值,进行可选值绑定
8.可选的协议要求
- 可选的时候使用
optional
关键字 - 可选要求用在你需要和 Objective-C 打交道的代码中。协议和可选要求都必须带上@objc属性
@objc protocol CounterDataSource { optional func incrementForCount(count: Int) -> Int optional var fixedIncrement: Int { get } } 复制代码
8.协议扩展
-
协议可以通过扩展来为遵循协议的类型提供属性、方法以及下标的实现。通过这种方式,你可以基于协议本身来实现这些功能,而无需在每个遵循协议的类型中都重复同样的实现,也无需使用全局函数
-
扩展
RandomNumberGenerator
协议,增加randomBool()
方法extension RandomNumberGenerator { func randomBool() -> Bool { return random() > 0.5 } } 复制代码
-
提供默认实现
-
为协议扩展添加限制条件
-
在扩展协议的时候,可以指定一些限制条件,只有遵循协议的类型满足这些限制条件时,才能获得协议扩展提供的默认实现。这些限制条件写在协议名之后,使用 where 子句来描述
-
textualDescription返回整个集合的文本描述,讲文本描述用,拼接起来,包括在【】中
-
Hamster 结构体符合TextRepresentable协议,放在一个数组中,array 符合CollectionType协议,
-
可以进行textualDescription方法,
-
如果多个协议扩展都为同一个协议要求提供了默认实现,而遵循协议的类型又同时满足这些协议扩展的限制条件,那么将会使用限制条件最多的那个协议扩展提供的默认实现