Swift数组包含闭包

时间:2018-08-22 08:59:21

标签: swift closures

我写了一个状态机free (hh); free(ampm); free(sub);,并添加了添加class处理程序的可能性:

onChange

我正在视图控制器中添加这样的更改侦听器:

private var handlers = [((UserState) -> Void)]()

func onChange(handler: @escaping ((UserState) -> Void)) {
    self.handlers.append(handler)
}

func changeState(to newState: UserState) {
    print($0.self)
    $0(newState)
}

闭包现在是添加了它的视图控制器还是状态机所拥有?我必须添加对override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UserStateMachine.shared.onChange { newState in self.setIcon(newState.premium) } } 元素的弱引用吗?

1 个答案:

答案 0 :(得分:1)

要非常直接地回答您的第一个问题,闭包由您的状态机类拥有。状态机保留了闭包,闭包捕获了对视图控制器的强烈引用。

是的,您将需要在此处添加一个弱引用,因为您的共享状态机似乎是一个永久存在的单例,除非您有某种机制可以在注销视图控制器之前注销并删除闭包。

但是,单例保留对视图控制器的引用几乎没有任何意义,因此,我建议添加一个[weak self]