Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
81 lines (65 sloc) 2.07 KB
layout title subtitle date key tags
article
如何重写 `delegate`
"有时候真的需要重写 `delegate`, 了解一下?"
2018-06-01 12:00:00 -0700
1010
iOS基础
Swift

有时候真的需要重写 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() {

  }
}
You can’t perform that action at this time.