【问题标题】:Role of Swift 3 lazy var with no getter没有 getter 的 Swift 3 惰性 var 的作用
【发布时间】:2017-05-05 21:34:24
【问题描述】:

当我不使用 getter 或 setter 时,我想知道惰性关键字的含义。看这段代码:

class ViewController: UIViewController
{
    lazy var toto = 5
}

编译器接受惰性关键字,但我不知道为什么。懒惰意味着我只会在阅读时计算该值。但是对于整数值不需要计算任何东西。

【问题讨论】:

    标签: swift


    【解决方案1】:

    lazy 表示 stored property 的初始值在第一次访问时被评估和分配(所以这实际上与 getter 无关 或与 computed 属性一起使用的 setter)。

    lazy var toto = ... some expression evaluating to an `Int` ...
    

    定义一个惰性Int 属性。

    lazy可以用来延迟初始值的求值 直到需要该属性,例如如果该评估是 “昂贵”或有副作用。

    但是从语言/编译器的角度来看,右边的初始值 可以是任意表达式。 它是常量还是涉及函数调用的“复杂”表达式都没有关系。

    lazy var a = 5 // A constant
    lazy var b = someFunctionReturningAnInt() // Function call
    lazy var c = { _ -> Int in
                   return 42
                 }()               // Immediately evaluated closure
    

    都是有效的定义。使用带有常量初始值的lazy 没有任何优势,但它是有效的 Swift。

    【讨论】:

      【解决方案2】:

      你应该只使用惰性来初始化一个新的类变量。 official Swift guide 给出了一个很好的例子,总结如下:

       class DataImporter {
          init() {
            //importing data, non-trivial task
          }
        }
      
        class DataManager {
          lazy var dataImporter = DataImporter()
      
          init() {
            //here, dataImporter is not yet created because it is lazy to move its ass~
        }
      
      
       let manager = DataManager() // manager.dataImporter is NOT created yet
       manager.dataImporter //ONLY now it is created
      

      【讨论】:

      • 类变量是什么意思?你能快速给我一个例子吗?
      猜你喜欢
      • 2015-05-15
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 2017-11-04
      • 2018-07-08
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多