斯威夫特的懒惰只读房产

时间:2014-09-25 21:09:17

标签: swift

在使用Swift玩一点时,我尝试编写一个只读和延迟的初始化属性。我很快就编写了这行代码,只是为了了解它是不允许的。

// no valid Swift code.
lazy let foo : Int = { return 42 }()

您必须将延迟属性声明为var。 这本快速的书明确指出,懒惰是不可能有充分理由的:

  

“您必须始终将惰性属性声明为变量(使用var关键字),因为在实例初始化完成之后,可能无法检索其初始值。在初始化完成之前,常量属性必须始终具有值,因此不能声明为惰性。“

假设我想在swift中拥有一个readonly lazy属性。存档的最佳方式是什么?

3 个答案:

答案 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
}