首页 > 解决方案 > 闭包存储在类属性中

问题描述

不明白为什么编译器会在此代码段上出错

class Addr {

    var num: Int = 0
    lazy var increment: (Int) -> () = {[unowned self] value in
        self.num += value
        print(self.num)
    }
    deinit {
        print("deinit")
    }
}

do {
    let object = Addr().increment(5) // ERROR
}

当然,我可以将捕获列表 [unowned self] 更改为 [weak self],但我试图理解为什么这段代码不起作用。为什么对象在属性调用之前是 deinit 。将感谢对该机制的高级解释。

标签: swift

解决方案


问题是,由于您没有存储对Addr对象的引用,它会立即被释放,甚至在increment它被调用之前。

存储Addr在变量中然后调用increment该变量可以解决问题。

let object = Addr()
object.increment(5)

推荐阅读