Swift 下用 lazy 让方法只被调用一次

在写 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,但无疑是非常简单好用的。

释放剪贴板潜力,效率更上一层楼

PasteNow

PasteNow 是一款剪贴板管理工具,它将使你的日常工作更轻松和快捷。你可以通过它存储各种各样的临时数据:文本、链接、图像等等。

No Comment

Leave a Comment