swift 将={}()与lazy属性一起使用与仅使用=有什么区别

czfnxgou  于 2023-03-07  发布在  Swift
关注(0)|答案(2)|浏览(89)

使用lazy property语法有两种不同的方式,我看不出它们之间的区别:

//1
lazy var a = { "hello" }()

//2
lazy var b = "hello"

换句话说,为什么要使用或不使用{}()?它们之间有区别吗?或者只是做同样的事情看起来不同?

ewm0tg9j

ewm0tg9j1#

lazy不关心你是否用闭包初始化属性。lazy只是让属性惰性初始化,即初始化表达式(=之后的部分)在第一次访问属性时求值。该表达式可以是任何东西:字符串文字,或者立即调用的闭包,或者任何你喜欢的。
这里的区别就是"foo"{ "foo" }()的不同,前者只是一个字符串常量,而后者调用闭包,闭包返回相同的字符串,所以这是一个很小的开销,如果你使用-O,这个开销会被完全优化掉,使用Godbolt.org,您可以验证使用-O时程序集输出是否相同:字符串文字|关闭

fkaflof6

fkaflof62#

创建值后需要修改值时会有所不同。例如:

lazy var dateFormatter = {
    let df = DateFormatter()
    dateFormatter.dateFormat = "yyyyMMdd" // We can modify the value before setting it
    return df
}()

相关问题