包含闭包的Swift数组

包含闭包的Swift数组,swift,closures,Swift,Closures,我编写了一个状态机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

我编写了一个状态机
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)
    }
}

关闭现在是由添加它的视图控制器拥有还是由状态机拥有?我是否必须向
处理程序
元素添加弱引用?

您在转义闭包中捕获了
自我
,因此,是的,您应该使用
(或
无主
)处理这种情况


此外,您还可以检查控制器
deinit
s是否没有问题(即控制器调用
deinit
)-控制器中的所有闭包都得到了正确处理。如果从未调用过
deinit
,则应考虑在可用闭包中缺少
/
无主

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

是的,您需要在此处添加弱引用,因为您的共享状态机似乎是一个将永远存在的单例,除非您在视图控制器被解除之前有某种取消注册和删除闭包的机制


但是,单例保留对视图控制器的引用很少有意义,因此我建议添加一个
[弱自]

,这取决于具体情况。你希望你的控制器被释放吗?如果是,那么您真的需要使用
[弱自我]
。顺便说一句,这是可以通过通知轻松解决的问题。您基本上是在重新实现通知。