有时候真的需要重写
delegate
, 了解一下?
如何重写 delegate
?
在探索这个标题之前我们先来了解一下 Swift Protocol
的继承。
Swift Protocol 继承
protocol ProtocolA {
func functionProtocolA()
}
protocol ProtocolB: ProtocolA {
func functionProtocolB()
}
上面的代码是很容易理解的,ProtocolB
继承自 ProtocolA
,所以 对于 ProtocolB
就有两个方法, functionProtocolA()
和 functionProtocolB()
, 而 ProtocolA
依然只有 functionProtocolA()
一个方法。这个对于 iOS 开发者来说是很熟悉的。系统API中就有很多这样的例子。
比如:Hashable
继承自 Equatable
, UITableViewDelegate
继承自 UIScrollViewDelegate
…
那么什么时候需要重写 delegate
?
class ClassA {
var delegate: ProtocolA?
}
class ClassB: ClassA {
override var delegate: ProtocolB?
}
上面这段代码看起来是没问题的。可是 Command + B
会发现是有问题的。而且还会出现以下错误信息:
error: property 'delegate' with type 'ProtocolB?' cannot override a property with type 'ProtocolA?'
可以理解为不允许重写 Protocol
。
解决方法:利用 as?
在 didSet
将 delegate
转换成 ProtocolB
这样在设置 delegate
的时候就相当于设置了 aDelegate
. 代码如下所示:
class ClassB: ClassA {
private var bDelegate: ProtocolB?
override var delegate: ProtocolA? {
didSet {
bDelegate = delegate as? ProtocolB
}
}
}
如何使用呢?
/// 注意这里的 Protocol 是 ProtocolB
class ClassC: ProtocolB {
let classB: ClassB
init() {
classB = ClassB()
classB.delegate = self
}
/// mark: - ProtocolA
func printProtocolA() {
}
/// mark: - ProtocolB
func printProtocolB() {
}
}