在写 Swift 的过程中,我们会经常使用 lazy 来延迟一个对象的初始化。今天我发现了一个关于 lazy 的新的用法,也就用 lazy 来达到使「方法」只被调用一次,而不仅限于用在「对象」上。
lazy 常常用在一个对象需要延迟加载、或者初始化它的时候,要求 self 已经初始化成功的情况,比如:
lazy var shareItem: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(ProfileViewController.share))
这是一种非常常用的用法,我之前在写 Swift 的时候,也只把 lazy 用在了这种对象的初始化上。事实上,lazy 也可以用在方法的调用上,不同的是,它的类型从具体的类型,变成了 Void。
比如看这个例子:
lazy var setupInitialLayout: Void = {
// Do some layout and no need to return something
}()
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
_ = self.setupInitialLayout
}
上面这个例子使用 lazy,修饰了一个「Void」对象,即:它也是一个执行过程,但它不会返回一个对象。我用它来做一些一次性的 layout 相关的动作,放在比如 viewDidLayoutSubviews 这样的位置,通过 _ = self.setupInitialLayout 的形式调用它。
之后,无论你的 ViewController 发生了啥变化,setupInitialLayout 这个方法再也不会被调用到了。
这种用法算一个 trick,但无疑是非常简单好用的。