// 可选协议和协议扩展
// 原生的 Swift protocol里 没有可选项,所有定义的方法都是必须实现的。如果我们想要像 OC 里那样定义可选的协议方法,就需要将协议本身和可选方法都定义 OC的,也即在 protocol 定义之前以及协议方法之前加上 @objc 。另外和 OC 的 @optional 不同,我们使用没有@符号的关键字 optional 来定义可选方法:
@objc protocol OptionalProtocol {
@objc optional func optionalMethod() // 可选
func necessaryMethod() // 必须
@objc optional func anotherOptionalMethod() // 可选
}
// 另外,对于所有的声明,他们的前缀修饰是完全分开的。也就是说你不能像是在 OC 里用一个 @optional 指定接下来的若干方法都是可选的了,必选对每一个可选方法添加前缀,对于没有前缀的方法来说,他们是默认必须实现的:
// 一个不可避免的限制是,使用 @objc 修饰的 protocol 就只能被 class 实现了,也就是说,对于 struct 和 enum 类型,我们是无法无法令它们所实现的协议中含有可选方法或者属性的。另外,实现它的 class 中方法还必须也就备注 @objc, 或者这个类就是继承 NSObject。这对我们写代码来说是一种让人郁闷的限制。
// 在 Swift 2.0, 我们有了另一种选择,那就是使用 protocol extension。我们可以在声明一个 protocol 之后再用 extension 的方式给部分方法默认的实现。这样这些方法在实际的类中就是可选的了。