使用惰性执行代码一次 - Swift

Posted

技术标签:

【中文标题】使用惰性执行代码一次 - Swift【英文标题】:Using lazy this execute code once - 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)。 【参考方案1】:

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


    print("hrlllo ")
    doSomething()
    return 

被评估。

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

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

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

【讨论】:

以上是关于使用惰性执行代码一次 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的惰性只读属性

Swift 常量默认是惰性的吗?

多次加载的 Swift 惰性变量(计算属性?)

Swift 中的惰性属性相当于 Objective C 中的惰性 Init getter

js之惰性函数

Swift 惰性变量和 didReceiveMemoryWarning