使用lazy property语法有两种不同的方式,我看不出它们之间的区别:
lazy property
//1 lazy var a = { "hello" }() //2 lazy var b = "hello"
换句话说,为什么要使用或不使用{}()?它们之间有区别吗?或者只是做同样的事情看起来不同?
{}()
ewm0tg9j1#
lazy不关心你是否用闭包初始化属性。lazy只是让属性惰性初始化,即初始化表达式(=之后的部分)在第一次访问属性时求值。该表达式可以是任何东西:字符串文字,或者立即调用的闭包,或者任何你喜欢的。这里的区别就是"foo"和{ "foo" }()的不同,前者只是一个字符串常量,而后者调用闭包,闭包返回相同的字符串,所以这是一个很小的开销,如果你使用-O,这个开销会被完全优化掉,使用Godbolt.org,您可以验证使用-O时程序集输出是否相同:字符串文字|关闭
lazy
=
"foo"
{ "foo" }()
-O
fkaflof62#
创建值后需要修改值时会有所不同。例如:
lazy var dateFormatter = { let df = DateFormatter() dateFormatter.dateFormat = "yyyyMMdd" // We can modify the value before setting it return df }()
2条答案
按热度按时间ewm0tg9j1#
lazy
不关心你是否用闭包初始化属性。lazy
只是让属性惰性初始化,即初始化表达式(=
之后的部分)在第一次访问属性时求值。该表达式可以是任何东西:字符串文字,或者立即调用的闭包,或者任何你喜欢的。这里的区别就是
"foo"
和{ "foo" }()
的不同,前者只是一个字符串常量,而后者调用闭包,闭包返回相同的字符串,所以这是一个很小的开销,如果你使用-O
,这个开销会被完全优化掉,使用Godbolt.org,您可以验证使用-O
时程序集输出是否相同:字符串文字|关闭fkaflof62#
创建值后需要修改值时会有所不同。例如: