在使用Swift玩一点时,我尝试编写一个只读和延迟的初始化属性。我很快就编写了这行代码,只是为了了解它是不允许的。
// no valid Swift code.
lazy let foo : Int = { return 42 }()
您必须将延迟属性声明为var
。
这本快速的书明确指出,懒惰是不可能有充分理由的:
“您必须始终将惰性属性声明为变量(使用var关键字),因为在实例初始化完成之后,可能无法检索其初始值。在初始化完成之前,常量属性必须始终具有值,因此不能声明为惰性。“
假设我想在swift中拥有一个readonly lazy属性。存档的最佳方式是什么?
答案 0 :(得分:40)
如果readonly和private在这种特定情况下是您的同义词,那么您可以通过明确声明它来使setter变为私有:
private(set) lazy var foo : Int = { return 42 }()
这是不变性和懒惰之间的妥协。
答案 1 :(得分:6)
您还可以使用懒惰初始化的私有后备变量:
var foo : Int { return _foo }
private lazy var _foo :Int = { return 42 }()
答案 2 :(得分:3)
可以使用计算属性和私有结构来完成此操作。静态var值上不需要lazy关键字,因为为其赋值,块的结果是隐式的。
var foo: Int {
struct Holder {
static var value = { return 42 }()
}
return Holder.value
}