'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 1:[1]

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.

Solution 2:[2]

You should declare life like this:

lazy var life:Int = {
    return self.myUser.age
}()

Because you are trying to initialise one property(variable) with another during initialisation process. At this time variables are not available yet.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Eugene Laminskiy