没有吸气剂的Swift 3 lazy var的作用

时间:2016-12-20 15:48:12

标签: swift

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

class ViewController: UIViewController
{
    lazy var toto = 5
}

编译器接受lazy关键字,但我不知道为什么。懒惰意味着我只在阅读时计算出的价值。但是没有必要为整数值计算任何东西。

2 个答案:

答案 0 :(得分:4)

lazy表示在第一次访问时评估并分配存储属性的初始值(因此这实际上与getter无关) 或者与计算属性一起使用的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。

答案 1 :(得分:2)

你应该只使用lazy初始化一个新的类变量。 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