如何重写 `delegate`

 

有时候真的需要重写 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 继承EquatableUITableViewDelegate 继承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?didSetdelegate 转换成 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() {

  }
}