在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
是必经之路!