默认情况下 Swift 常量是惰性的吗?
Are Swift constants lazy by default?
我对 Swift 仍然不太了解的事情...假设我想要一个 属性 实例化一个 class 在基础 class 中用于几个子classes,例如...
let horse = Horse();
horse
是在 app/class 初始化后立即实例化还是在 属性 首次访问时实例化?
另一方面,使用 lazy var
保证 属性 仅在第一次访问时实例化...
lazy var horse = Horse()
但是 horse
不是常数。所以在这种情况下,如果我多次访问 horse
,我会创建多个 horse
实例,对吗?
如果我同时想要两者,一个懒惰的 属性 又是一个常量怎么办?
不完全是。假设你有一个 class Farm
并且在 Farm
里面有 horse
属性.
class Farm {
let horse = Horse()
}
在这种情况下,horse
属性 在 class 实例初始化时被初始化。如果你让它 lazy
你也必须让它可变。
class Farm {
lazy var horse = Horse()
}
本例中horse
属性在第一次访问时被初始化。稍后再次访问它时,它 return 再次使用相同的实例,而不是重新初始化它。但是因为它是一个可变的 属性 你可以给它分配一个新的 Horse
实例。为它分配新值后,无论何时访问它都会 return 这个新值。
编辑: 如果 let horse = Horse()
是在全局 space 中定义的,那么它是在第一次访问时延迟创建的。
好吧,有点晚了,但我认为你可以使用 private(set)
创建一个 lazy
属性 as constant 。考虑以下示例:
import Foundation
struct GPS: CustomStringConvertible {
let name: String
init(name: String) {
self.name = name
print("GPS Initialised")
}
var description: String {
return name
}
}
struct Car {
private(set) lazy var gps = GPS(name: "One")
init() {
print("Car Initialised")
}
}
var someCar = Car()
print(someCar.gps) // Comment/Uncomment this to see lazy in action
//someCar.gps = GPS("Two") // This will create a compilation error
//
但是,如果你去掉private(set)
,它(gps里面的变量Car)就会变成variable 再次可以变异。
您可以在删除 private(set)
后取消注释最后一行以验证是否相同
我对 Swift 仍然不太了解的事情...假设我想要一个 属性 实例化一个 class 在基础 class 中用于几个子classes,例如...
let horse = Horse();
horse
是在 app/class 初始化后立即实例化还是在 属性 首次访问时实例化?
另一方面,使用 lazy var
保证 属性 仅在第一次访问时实例化...
lazy var horse = Horse()
但是 horse
不是常数。所以在这种情况下,如果我多次访问 horse
,我会创建多个 horse
实例,对吗?
如果我同时想要两者,一个懒惰的 属性 又是一个常量怎么办?
不完全是。假设你有一个 class Farm
并且在 Farm
里面有 horse
属性.
class Farm {
let horse = Horse()
}
在这种情况下,horse
属性 在 class 实例初始化时被初始化。如果你让它 lazy
你也必须让它可变。
class Farm {
lazy var horse = Horse()
}
本例中horse
属性在第一次访问时被初始化。稍后再次访问它时,它 return 再次使用相同的实例,而不是重新初始化它。但是因为它是一个可变的 属性 你可以给它分配一个新的 Horse
实例。为它分配新值后,无论何时访问它都会 return 这个新值。
编辑: 如果 let horse = Horse()
是在全局 space 中定义的,那么它是在第一次访问时延迟创建的。
好吧,有点晚了,但我认为你可以使用 private(set)
创建一个 lazy
属性 as constant 。考虑以下示例:
import Foundation
struct GPS: CustomStringConvertible {
let name: String
init(name: String) {
self.name = name
print("GPS Initialised")
}
var description: String {
return name
}
}
struct Car {
private(set) lazy var gps = GPS(name: "One")
init() {
print("Car Initialised")
}
}
var someCar = Car()
print(someCar.gps) // Comment/Uncomment this to see lazy in action
//someCar.gps = GPS("Two") // This will create a compilation error
//
但是,如果你去掉private(set)
,它(gps里面的变量Car)就会变成variable 再次可以变异。
您可以在删除 private(set)
后取消注释最后一行以验证是否相同