默认情况下 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) 后取消注释最后一行以验证是否相同