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

时间:2017-05-04 09:58:55

标签: swift lazy-loading lazy-evaluation lazy-initialization

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

1。直接初始化

`lazy var someViews: UILabel = UILabel()`

2。 init with block

    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
    }()

如果我想懒惰地使用某个默认值初始化某个变量。我只能使用第二种方式。但这似乎太笨拙了。 所以,我使用以下方法初始化lazy var。它运行正常。但它真的没问题吗?我想要一些帮助。

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
    }
}

3 个答案:

答案 0 :(得分:1)

是的,没关系,但你的initSomeViews()与使用块的概念相同。你可以直接为它分配一个clouser或一个方法。

  

注意:

     

如果你在viewDidLoad中使用你的懒惰属性:那就没有了   需要宣布它是懒惰的。

     

- 它们只被初始化一次并且再也没有计算过,也就是说它们没有动态计算。

答案 1 :(得分:1)

我建议 NOT 使用闭包变体:

_handleTextChange = inputValue => {
    this.setState({ inputValue : inputValue});
  };

为什么?

我自己做了一个小研究。请按this link阅读详细说明。

正确使用功能:

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

答案 2 :(得分:1)

作为一个安全风格的问题(我可能会为此付出代价......)我很喜欢使用隐式解包的选项:

private var someViews: UILabel!

override func viewDidLoad() {
    self.someViews = createSomeViews()
}

private func createSomeViews() -> UILabel { ... }

<强>安全即可。在viewDidLoad方法上一次运行初始化,在视图控制器设置中为您提供了一个很好的确定性代码路径。相反,使用lazy您可能有多个代码路径触发var创建,可能隐藏了令人讨厌的潜在错误(例如,在视图中考虑交叉依赖性等)。

<强>风格即可。我能说什么?它看起来更好看:)

但是,如果你的var初始化包含你希望尽可能推迟的一些代价高昂的计算,那么lazy就是要走的路!