延迟加载可能稍后为零的可选属性

Posted

技术标签:

【中文标题】延迟加载可能稍后为零的可选属性【英文标题】: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()

【问题讨论】:

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

【讨论】:

以上是关于延迟加载可能稍后为零的可选属性的主要内容,如果未能解决你的问题,请参考以下文章

延迟的加载

Hibernate延迟加载

Hibernate延迟加载

Hibernate延迟加载

Hhibernate延迟加载

JavaScript 中的延迟加载属性模式