我试图防止同时调用一个函数。为了测试这一点,我特意在viewdidload和viewwillappear中都调用了这两个函数。当我加载应用程序时,它只会被调用一次。但是,当我切换视图并返回到控制器时,“ viewwillappear”不会调用该函数吗?为什么会这样呢?我需要viewwillappear来调用该函数。
lazy var executeOnce: () -> Void = {
print("hrlllo ")
doSomething()
return {}
}()
override func viewDidLoad() {
super.viewDidLoad()
executeOnce()
}
override func viewWillAppear(_ animated: Bool) {
executeOnce()
}
答案 0 :(得分:-1)
executeOnce
是存储的属性。在viewDidLoad()
中调用它时,其定义中的闭包
{
print("hrlllo ")
doSomething()
return {}
}
被评估。
在您的情况下,您将返回一个空的闭包{}
,然后使用()
执行它,这等于void或不执行任何操作。该值Void
是存储在属性executeOnce
中的值。
因此,无论何时调用executeOnce()
,都不会评估初始闭包,而是存储在被调用的executeOnce
中的值Void
中。因此,将不会执行任何操作。
关键字lazy
仅将闭包的执行延迟到需要时为止。与仅评估一次的闭包无关。