延迟加载可选属性,可能稍后

时间:2014-11-27 10:12:03

标签: ios swift

在Objective-C中,使用延迟初始化,我可以将@property设置为nil,并在调用getter时重新创建。

然而,在Swift中,使用lazy修饰符,它不起作用 使用以下代码进行测试:

class SomeClass {
    lazy var optionalVar: String? = {
        return "abc"
    }()

    func checkVar() {
        println(optionalVar!)
    }
}

let instance = SomeClass()
instance.checkVar()
//instance.variable = nil
instance.checkVar()

variable设置为nil时,它将不会重新初始化。因此,下一行代码会触发运行时错误。

如何使我的Swift代码与Objective-C一样工作?
感谢。

----------------
编辑:添加更多代码

class SomeClass {
    var optionalVar: String?

    func checkVar() {
        println(optionalVar!)
    }

    func createVar() -> String {
        if let tempVar = optionalVar {
            return tempVar
        } else {
            println("create optional")
            return "123"
        }
    }
}

let instance = SomeClass()
instance.optionalVar = instance.createVar()
instance.checkVar()
instance.optionalVar = nil
instance.optionalVar = instance.createVar()
instance.checkVar()

1 个答案:

答案 0 :(得分:1)

除了this answer中已经提出的建议之外,我可以提出的最优雅的替代解决方案是在属性设置为nil时进行拦截,并使用默认值覆盖赋值:

class SomeClass {
    private var _optionalVar: String?

    var nonoptionalVar: String? {
        get { return _optionalVar }
        set { _optionalVar = newValue == nil ? "123" : newValue }
    }

    init() {
        self.nonoptionalVar = nil
    }
}

但有一个缺点:您必须记住在初始化程序中将属性显式设置为nil(否则属性将保留其默认初始值,即nil

相关问题