Swift中反向传值的方式

最后更新时间:2017.6.30

在Swift中的反向传值方式有几种,如代理、通知、KVO、闭包(closure)等等。这里只要说说代理和闭包,Swift中的代理和闭包与Objective-C中代理和block反向传值的方式类似。

这里只是简单的步骤示例,做个记录,并未深究。

使用场景

BA传值是开发中必不可少的需求,如ViewViewController传值,subViewControllerViewController传值等。

闭包(closure)

闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift中的闭包和C和Objective-C中的代码块(block)以及其他一些编程语言中的匿名函数比较相似。关于闭包的更多信息,查阅最后提供的参考资料。以下以一个在View中的UIButton点击事件传值给ViewController举例。

  1. B中为closure声明一个类型别名

    1
    typealias ClosureType = (UIButton) -> Void
  2. B中定义一个closure变量

    1
    var closure: ClosureType?
  3. B中需要传值的地方调用

    1
    self.closure?(sender)
  4. A中写接受传值

    1
    2
    3
    4
    let b = B()
    b.closure = {(sender: UIButton) -> Void in
    // xxx
    }

代理(delegate)

代理可能有点绕,熟悉后就很简单。举个例子,B要传值给A,那么B就拥有代理属性,A就是B的代理。

  1. B中声明协议,最新已不需要继承NSObjectProtocol

    1
    2
    3
    protocol CellDelegate: NSObjectProtocol {
    func cell(_ cell: Cell, sender: UIButton)
    }
  2. B中定义代理属性,最新已不需要weak

    1
    weak var delegate: CellDelegate?
  3. B中调用代理方法

    1
    self.delegate?.cell(self, sender: sender)
  4. A中实现代理方法

    1
    2
    3
    4
    5
    6
    let b = B()
    b.delegate = self
    // MARK: - CellDelegate
    func cell(_ cell: Cell, sender: UIButton) {
    // xxx
    }

参考资料

Closures

Protocols