lazy
:`lazy var someViews: UILabel = UILabel()`
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
}
}
答案 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
就是要走的路!