我仍然不太了解Swift ...我想说我想要一个属性来实例化一个用于几个子类的基类中的类,例如: ...
let horse = Horse();
在app / class初始化之后或第一次访问该属性时是否horse
实例化了吗?
另一方面,使用lazy var
保证该属性仅在第一次访问时被实例化...
lazy var horse = Horse()
但是horse
不是常数。因此,在这种情况下,如果我多次访问horse
,我会创建多个horse
实例,对吗?
如果我想要两者,一个懒惰的属性也是常数怎么办?
答案 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)
后取消对最后一行的注释,以确认是否相同