Закрытие хранится в свойстве класса - PullRequest
0 голосов
/ 21 мая 2019

Не понимаю, почему компилятор делает ошибку в этом фрагменте кода

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] на [слабое self], но я пытаюсь понять, почему этот код не работает. Почему объект является deinit перед вызовом имущества. Будем благодарны за подробное объяснение этого механизма.

1 Ответ

1 голос
/ 21 мая 2019

Проблема в том, что, поскольку вы не сохраняете ссылку на объект Addr, он немедленно освобождается, даже до того, как increment будет вызван для него.

Сохранение Addr в переменной и последующий вызов increment для переменной решает проблему.

let object = Addr()
object.increment(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...