Swift Variables Initialization Swift Variables Initialization swift swift

Swift Variables Initialization


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 optional.

    let label: UILabelinit() { ... 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) optional and also 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}()


Both ways are correct, but sometimes you should use the initialization in init() method. For example, here the target for barButton will be not set, cause the self does not exist yet.

class Foo {    var barButton = UIBarButtonItem(title: "add", style: .Plain, target: self, action: #selector(self.someMethod))    init(){        //init here    }}

The correct way for this case is :

class Foo {    var barButton : UIBarButton?     init(){        barButton = UIBarButtonItem(title: "add", style: .Plain, target: self, action: #selector(self.someMethod))    }}

To sum up, both ways are correct, but you have to consider when to use each one.More information about it on Apple documentation


 var label: UILabel! 

The above statements means, the variable label may be nil

var label = UILabel()

But here it will hold a label value. Because the memory is allocated for that variable. So it will not be nil.

Please find more details here

What's the difference between var label: UILabel! and var label = UILabel( )?