在Swift中使用惰性var的优势是什么
初始化的优点或区别是什么:在Swift中使用惰性var的优势是什么,swift,Swift,初始化的优点或区别是什么: lazy var hintView: HintView = { let hintView = HintView() return hintView }() 不要简单地使用: var hintView = HintView() (HintView是:classhintview:UIView{}) 非常感谢您的帮助。在某些情况下,使用lazyvars可能会更快,因为当您第一次访问它们时,它们只计算一次。只有在第一次访问时,才会计算laz
lazy var hintView: HintView = {
let hintView = HintView()
return hintView
}()
不要简单地使用:
var hintView = HintView()
(HintView
是:classhintview:UIView{}
)
非常感谢您的帮助。在某些情况下,使用
lazy
vars可能会更快,因为当您第一次访问它们时,它们只计算一次。只有在第一次访问时,才会计算lazy存储属性
它是var
而不是let
,因为该值在初始化过程中未初始化。以后再计算。这就是为什么惰性存储属性需要是变量
,而不是常量
lazy var hintView: HintView = {
let hintView = HintView()
return hintView
}()
let h = hintView
在上述代码中,每当第一次访问hintView
时,将执行分配给它的闭包
,并返回值并存储在h
中
有关更多信息,请参阅:
延迟存储属性与存储属性
使用惰性属性而不是存储属性有一些好处
self
让我们实事求是地做吧。看到截图了吗 我刚刚在
viewDidLoad
中停止了调试器。您可以看到,secondHintView
具有一个内存,因为它是不懒惰的存储,但是hintView
仍然是nil,因为它是一个懒惰的内存。一旦使用/访问惰性变量,内存就会被分配
同样,lazy应该始终是var。在一个单独的函数中分离变量的内容/计算也是一个很好的做法,以确保可读性,如下所示:
// MARK: Public views
lazy var titleView = getTitleView()
lazy var hintView = getHintView(.red)
lazy var secondHintView = getHintView(.blue)
lazy var thirdHintView = getHintView(.yellow)
lazy var fourthHintView = getHintView(.brown)
// MARK: Private functions
private func getTitleView() -> TitleView {
let view = TitleView()
return view
}
private func getHintView(_ textColor: UIColor) -> HintView {
let view = HintView()
view.textColor = textColor
return view
}
这样,您就可以重用一些功能,只需编写更少的代码,所有变量的可读性也会大大提高。例如,我有5个独立的变量,但我一眼就能看到它们。鉴于
hintView
是某类型的成员,某个实例迟早会被实例化(比如instancefoo
);后者将始终实例化foo
的HintView
实例(作为成员属性),而前者仅在访问foo.HintView
时实例化HintView
实例。如果一个HintView
的实例化相当于一些计算上的繁重负载,那么只有当它所绑定的属性被实际使用时,才可以执行此实例化。@dfri非常感谢您的详细描述。因为这完美地回答了我的问题,请随时发布答案。我相信现有的答案也很好地涵盖了这一点,所以我将把它作为上面的评论。很乐意帮忙!也许值得指出一点(我在下面没有看到):静态
属性默认为惰性
(可变和不可变)。惰性变量只执行一次,初始值不会在每次尝试访问该值时更改。存储的let属性也会计算一次,你的意思是什么?我猜他是想和盖特比较variables@J.Doe关键是let立即计算一次,而lazy只在请求时计算——这意味着如果您从未尝试访问lazy变量,它将永远不会被计算。当变量计算比一些简单的初始化更复杂时,这可能很有用。请举例说明我们应该在哪里使用lazy var。@anes您可以在等待响应的变量中使用lazy<代码>延迟var响应,因为在调用服务之前,响应不在那里。如果您想在vc上显示customAlert,您可以使用lazy,但这并不总是添加到vc上。它将从某些条件中添加<代码>视图等。