Используя ленивый этот код выполнения один раз - Swift - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь предотвратить одновременный вызов функции.Чтобы проверить это, я специально вызвал обе функции в viewdidload и viewwillappear.Когда я загружаю приложение, оно вызывается только один раз.Но когда я переключаю представления и возвращаюсь обратно к контроллеру, «viewwillappear» не вызывает функцию?Почему это происходит.Мне нужно viewwillappear для вызова функции.

lazy var executeOnce: () -> Void = {
    print("hrlllo ")
    doSomething()
    return {}
}()


override func viewDidLoad() {
    super.viewDidLoad()

    executeOnce()

}


override func viewWillAppear(_ animated: Bool) {
    executeOnce()

}

1 Ответ

0 голосов
/ 28 сентября 2018

executeOnce в вашем коде является сохраненным свойством.Когда он вызывается в viewDidLoad(), вычисляется замыкание в его определении

{
    print("hrlllo ")
    doSomething()
    return {}
}

.

В вашем случае вы возвращаете пустое закрытие {}, а затем выполняете его с помощью (), что равно void или ничего не делать.Это значение Void хранится в вашей собственности executeOnce.

Таким образом, всякий раз, когда вы вызываете executeOnce(), начальное закрытие не оценивается, а является значением, хранящимся в executeOnce, которое вызывается, то есть Void.И, таким образом, ничего не будет выполнено.

Ключевое слово lazy будет только задерживать выполнение замыкания до тех пор, пока оно не потребуется.Это не имеет ничего общего с замыканием, оцененным только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...