Swift常量默认是懒惰的吗?

时间:2015-06-13 05:34:23

标签: swift lazy-initialization

我仍然不太了解Swift ...我想说我想要一个属性来实例化一个用于几个子类的基类中的类,例如: ...

let horse = Horse();

在app / class初始化之后或第一次访问该属性时是否horse实例化了吗?

另一方面,使用lazy var保证该属性仅在第一次访问时被实例化...

lazy var horse = Horse()

但是horse不是常数。因此,在这种情况下,如果我多次访问horse,我会创建多个horse实例,对吗?

如果我想要两者,一个懒惰的属性也是常数怎么办?

2 个答案:

答案 0 :(得分:2)

不完全是。假设您有一个班级Farm,并且Farm内有horse个属性。

class Farm {
    let horse = Horse()
}

在这种情况下,在初始化类实例时初始化horse属性。如果你做到lazy,你必须使它变得可变。

class Farm {
    lazy var horse = Horse()
}

在这种情况下,horse属性在第一次访问时被初始化。稍后再次访问它时,它会再次返回相同的实例,而不是重新初始化它。但由于它是一个可变属性,因此您可以为其分配一个新的Horse实例。在为其分配新值后,无论何时访问它都将返回此新值。

编辑:如果在全局空间中定义let horse = Horse(),则在首次访问时会延迟创建。

答案 1 :(得分:0)

好吧,有点晚了,但是我认为您可以使用lazy创建一个private(set)属性为常量。考虑下面的示例:

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),它( Car 中的 gps 变量)将再次成为变量,被变异。

您可以在删除private(set)后取消对最后一行的注释,以确认是否相同