闭包存储在类属性中

时间:2019-05-21 09:35:52

标签: swift

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

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
}

当然,我可以将捕获列表中的[未拥有的自我]更改为[弱的自我],但是我试图理解为什么此代码无法正常工作。为什么在调用属性之前将对象取消初始化。感谢对此机制的高级解释。

1 个答案:

答案 0 :(得分:1)

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

Addr存储在变量中,然后在变量上调用increment解决了这个问题。

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