Alexandr Kuzyaev Alexandr Kuzyaev - 28 days ago 8
Swift Question

Swift Variables Initialization

I have a question about variables initialization in swift.

I have two ways to initialize a variable (as "property" of a class in Objective-C).

Which of them is the most correct?

class Class {

var label: UILabel!

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

}


or

class Class {

var label = UILabel()

init() { … }

}

Answer

Actually you have 5 ways to initialize properties.

There is no correct way, the way depends on the needs.
Basically declare objects like UILabel always – if possible – as constant (let).

The 5 ways are:

  • Initialization in the declaration line

    let label = UILabel(frame:...
    
  • Initialization in the init method, you don't have to declare the property as implicit unwrapped.

    let label: UILabel
    init() { ... label = UILabel(frame:...) ... }
    

The first two ways are practically identical.

  • Initialization in a method like viewDidLoad, in this case you have to declare the property as implicit unwrapped and as var

    var label: UILabel!
    
    on viewDidLoad()
     ...
     label = UILabel(frame:...)
    }
    
  • Initialization using a closure to assign a default (computed) value. The closure is called once when the class is initialized and it is not possible to use other properties of the class in the closure.

    let label: UILabel = {
       let lbl = UILabel(frame:...)
       lbl.text = "Foo"
       return lbl
    }()
    
  • Lazy initialization using a closure. The closure is called (once) when the property is accessed the first time and you can use other properties of the class.
    The property must be declared as var

    let labelText = "Bar"
    
    lazy var label: UILabel = {
       let lbl = UILabel(frame:...)
       lbl.text = "Foo" + self.labelText
       return lbl
    }()
    
Comments