Search code examples
swiftclasspropertiesinitlazy-initialization

Property initializers run before 'self' is available


Seems like I'm having a problem with something that shouldn't be the case... But I would like to ask for some help.

There are some explanations here on the Stack I don't get.

Having two simple classes where one refers to another, as per below:

class User {
  lazy var name: String = ""
  lazy var age: Int = 0

  init (name: String, age: Int) {
      self.name = name
      self.age = age
  }
}

class MyOwn {
  let myUser: User = User(name: "John", age: 100)
  var life = myUser.age 
  //Cannot use instance member 'myUser' within property initializer
  //property initializers run before 'self' is available
}

I get the commented compile error. May someone please tell me what should I do to solve the case?


Solution

  • As correctly pointed out by vadian you should create an init in such scenarios:

    class MyOwn {
        let myUser: User
        var life: Int
    
        init() {
            self.myUser = User(name: "John", age: 100)
            self.life = myUser.age 
        }
    }
    

    You can't provide a default value for a stored property that depends on another instance property.