Swift Variables Initialization

17,611

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: 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) 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
    }()
    
Share:
17,611
Alexander Kuzyaev
Author by

Alexander Kuzyaev

7+ years of remote iOS hands-on experience. 2+ years of team leading & engineering management. Built products for 1+ million users. Areas: e-commerce, finance, social Swift, SwiftUI, UIKIt, Objective-C

Updated on June 04, 2022

Comments

  • Alexander Kuzyaev
    Alexander Kuzyaev almost 2 years

    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() { … }
    
    }