【问题标题】:Property Declarations in Apple CoreData TemplatesApple CoreData 模板中的属性声明
【发布时间】:2014-06-13 05:09:24
【问题描述】:

查看苹果提供的用于快速构建核心数据堆栈的样板代码,我发现为堆栈中的每个项目创建了两个变量,例如managedObjectModel 和 _managedObjectModel。我的理解是,一个属性的内部存储变量是由swift在内部创建和管理的,那么为什么我们必须手动创建一个呢?为什么我们不能只创建一个属性,让 swift 处理创建过程,如果在调用时不存在。提前致谢。

【问题讨论】:

    标签: ios core-data swift


    【解决方案1】:

    没有创建两个属性 - 一个是存储的属性,一个是计算的属性。模式是:

    class Foo {
      var _bar : Bar
      var  bar : Bar { return _bar }
    }
    

    var _bar 已存储,但 var bar 已计算。特定的 Apple 模式用于延迟初始化存储的属性,如下所示:

    class Foo {
      var _bar : Bar? = nil
      var  bar : Bar {
        if _bar == nil {
          /* compute some stuff */
          _bar = Bar (/* ... */)
        }
        return _bar!
      }
    }
    

    上面的用法很像@lazy property。你可以和它合二为一:

    class Foo {
      @lazy var bar : Bar = computeBar ()
    
      func computeBar () -> Bar {
        /* compute some stuff */
        return Bar (/* ... */)
      }
    }
    

    【讨论】:

    • 感谢您的回复。这对我来说很清楚。所以你不能同时使用一个方法/函数/属性吗?计算一个属性,如果它没有被创建,并存储它以备下次使用? @lazy 怎么样?还是不存储属性??抱歉有这些问题。我想我可以复制并粘贴该样板代码,但我想了解...再次感谢。
    • A @lazy 确实会导致存储属性;该属性的值是在第一次访问惰性属性时计算的。正如您所指出的,他们的样板代码中使用的 Apple 模式适用于 @lazy。见上面的编辑。
    • 非常感谢。很好的帮助
    • 不客气。将不胜感激“答案复选标记”。您可能会考虑将标题更改为更具描述性 - “Apple CoreData 模板中的属性声明”也许?
    • 我对堆栈溢出很陌生,一旦我获得足够的声誉,我会添加一个复选标记。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2015-09-26
    相关资源
    最近更新 更多