- 你也可以扩展协议以实现某些协议要求的功能或者添加能够帮助满足协议的类型的功能。
- 属性要求:对是否为计算属性或者存储属性没有要求,定义属性名称和类型以及属性是gettable还是同时gettable和settable。总是被声明为变量。
- 方法要求:允许可变参数,但不能给方法参数提供默认值。
- 可变方法要求:对于结构体和枚举类在协议里定义可变方法需要使用mutating关键字,而类不需要。
- 类的协议初始化方法要求:需要使用required关键字标识,被标记为final的类除外。
- 委派:委派是一种设计模式,使类或结构能够将其部分职责移交给(或委派)给另一种类型的实例。
- 通过扩展声明协议已满足:如果类型已经符合协议的所有要求,但尚未声明它采用该协议,则可以使其采用具有空扩展名的协议。
- 采用综合实现来满足一个协议:Swift在很多简单场景下为Equatable,Hashable和Comparable提供了自动的协议实现以避免重复写样板代码。
- 针对Equatable协议,以下三种情况Swift会自动帮助类型满足Equatable协议。
- 只包含满足Equatable协议的存储变量的结构体。
- 只包含满足Equatable协议的关联值的枚举类。
- 没有关联值的枚举类。
- 针对Hashable协议,以下三种情况Swift会自动帮助类型满足Hashable协议。
- 只包含满足Hashable协议的存储变量的结构体。
- 只包含满足Hashable协议的关联值的枚举类。
- 没有关联值的枚举类。
- 针对没有原始值的枚举类,Swift提供了自动对Comparable协议的实现。如果枚举类有关联值,那么关键值都需要满足Comparable协议。
- 协议组合:将多个协议通过&组合到一起。协议组合也允许包含一个类。
- 检查是否满足协议
- is返回true如果实例满足协议,反之返回false
- as?返回协议的可选值,返回nil如果实例不满足协议
- as!强制进行转化,并引发运行时错误如果downcast失败
- 可选协议要求:通过optional修饰符实现。当您在可选需求中使用方法或属性时,其类型自动变为可选。例如, (Int) -> String 类型的方法变为 ((Int) -> String)?。请注意,整个函数类型都包含在可选值中,而不是方法的返回值中。
- 协议扩展:协议扩展可以向类型添加协议的实现,但不能使协议扩展或继承另一个协议。
- 向协议扩展添加约束:通过在协议名称后写where条件实现。