【问题标题】:Lazy loading optional property that maybe nil later延迟加载可能稍后为零的可选属性
【发布时间】:2014-11-27 10:12:02
【问题描述】:

在 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()

【问题讨论】:

  • 是的,我确实读过这个问题,以及其他几个相同主题的问题。基本上,这些问题的答案都是模仿 Objective-C 解决方案。我正在寻找更优雅的解决方案。
  • 不幸的是,懒惰是为了一次性初始化。使用我的代码在链接问题中的Lazy 类怎么样?
  • 这是一个很好的解决方案,真的。但是,我想先熟悉语言,所以我会使用传统的方式。我正在考虑为每个var 创建许多methods。然后,我不会将它们设置为nil,而是调用 var 的“init 方法”,你怎么看?这样好吗?
  • 你能举个例子吗?

标签: ios swift


【解决方案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

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多