【问题标题】:Using lazy this execute code once - Swift使用惰性执行代码一次 - Swift
【发布时间】:2019-03-03 21:48:47
【问题描述】:

我试图阻止同时调用一个函数。为了测试这一点,我特意在 viewdidload 和 viewwillappear 中调用了这两个函数。当我加载应用程序时,它只会被调用一次。但是当我切换视图并返回控制器时,“viewwillappear”不会调用该函数?为什么会这样。我需要 viewwillappear 来调用该函数。

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


override func viewDidLoad() {
    super.viewDidLoad()

    executeOnce()

}


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

}

【问题讨论】:

  • 那么,由于已经在viewDidLoad 中调用了该函数,因此没有调用该函数似乎是正确的?我不确定我是否明白你的问题。另外,您忘记调用 super.viewWillAppear(animated)。

标签: swift


【解决方案1】:

executeOnce 在您的代码中是一个存储属性。在viewDidLoad()中调用时,其定义中的闭包

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

被评估。

在您的情况下,您将返回一个空闭包 {},然后使用 () 执行它,这等于 void 或什么都不做。此值Void 是存储在您的属性executeOnce 中的值。

所以,无论何时调用executeOnce(),初始闭包都不会被求值,而是被调用的executeOnce 中存储的值,即Void。因此,不会执行任何操作。

关键字lazy 只会延迟闭包的执行,直到需要。它与只评估一次的闭包无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多