init lazy lazy var使用方法而不是swift3中的块



在Swift3文档中。建议通过以下两种方式使用lazy

1。直接init

`lazy var someViews: UILabel = UILabel()`

2。初始用块

    lazy var overlayView: UILabel = { [unowned self] in
        let overlayView = UILabel()
        overlayView.backgroundColor = self.backgroundColor.withAlphaComponent(0.90)
        overlayView.font = UIFont.boldSystemFont(ofSize: YFCalendarOverlaySize)
        overlayView.textColor = self.overlayTextColor
        overlayView.alpha = 0.0
        overlayView.textAlignment = .center
        overlayView.translatesAutoresizingMaskIntoConstraints = false
        return overlayView
    }()

如果我想用一些默认值初始化一些变量。我只能使用第二种方式。但这似乎太笨拙了。因此,我使用以下方法来初始化懒惰变量。它运行正常。但是真的可以吗?我想要一些帮助。

class SomeViewController: UIViewController {
    lazy var someViews: UILabel = self.initSomeViews()
    override func viewDidLoad() {
        print(self.someViews)
    }
}
fileprivate extension SomeViewController {
    func initSomeViews() -> UILabel! {
        let overlayView = UILabel()
        overlayView.backgroundColor = UIColor.white.withAlphaComponent(0.90)
        overlayView.font = UIFont.boldSystemFont(ofSize: YFCalendarOverlaySize)
        overlayView.alpha = 0.0
        overlayView.textAlignment = .center
        overlayView.translatesAutoresizingMaskIntoConstraints = false
        return overlayView
    }
}

i建议不是使用闭合变体:

lazy var overlayView: UILabel = { [unowned self] in
    let overlayView = UILabel()
    // ...
    return UILabel()
}()

为什么?

我自己做了一项小型研究。请按照此链接阅读详细说明。

功能适当使用:

class SomeViewController: UIViewController {
    lazy var label: UILabel = self.getLabel()
}
fileprivate extension SomeViewController {
    func getLabel() -> UILabel {
        return UILabel()
    }
}

是的,这还可以,但是您的initSomeViews()与使用块相同的概念。您可以直接为其分配一个clouser,也可以为此分配方法。

注意:

如果您在ViewDidload中使用懒惰属性:需要将其声明为懒惰。

- 它们仅一次初始化一次,并且再也没有计算,也就是说它们不会动态计算。

作为安全 style (我可能会为此感到沮丧……(我喜欢使用隐含地解开包装为此:

private var someViews: UILabel!
override func viewDidLoad() {
    self.someViews = createSomeViews()
}
private func createSomeViews() -> UILabel { ... }

安全。立即运行初始化,在viewDidLoad方法上,在视图控制器设置上为您购买一个nice 确定性代码路径。相反,使用lazy,您可能有多个代码路径可以触发VAR创建,可能会隐藏讨厌的潜在错误(例如,思考您的视图中的交叉依赖性等(。

样式。我能说什么?它在眼中看起来更好:(

但是,如果您的var初始化包含一些您想尽可能推迟的昂贵计算,那么比lazy是必经之路!

最新更新