Swift变量初始化

Ale*_*aev 6 variables initialization ios swift

我有一个关于swift变量初始化的问题.

我有两种方法来初始化变量(作为Objective-C中类的"属性").

哪个是最正确的?

class Class {

  var label: UILabel!

  init() { ... label = UILabel() ... }

}
Run Code Online (Sandbox Code Playgroud)

要么

class Class {

  var label = UILabel()

  init() { … }

}
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 28

实际上,您有5种方法来初始化属性.

没有正确的方法,方式取决于需求.
基本上像UILabel往常一样声明对象- 如果可能的话 - 作为常量(let).

5种方式是:

前两种方式实际上是相同的.

  • 在类似的方法中进行初始化viewDidLoad,在这种情况下,您必须将属性声明为(隐式解包)可选,也作为var

    var label: UILabel!
    
    on viewDidLoad()
     ...
     label = UILabel(frame:...)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用闭包进行初始化以指定默认(计算)值.在初始化类时调用闭包,并且不可能在闭包中使用该类的其他属性.

    let label: UILabel = {
       let lbl = UILabel(frame:...)
       lbl.text = "Foo"
       return lbl
    }()
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用闭包进行延迟初始化.在第一次访问属性时调用(一次)闭包,您可以使用该类的其他属性.
    该财产必须声明为var

    let labelText = "Bar"
    
    lazy var label: UILabel = {
       let lbl = UILabel(frame:...)
       lbl.text = "Foo" + self.labelText
       return lbl
    }()
    
    Run Code Online (Sandbox Code Playgroud)