web-dev-qa-db-fra.com

Les initialiseurs de propriété s'exécutent avant que «self» ne soit disponible

On dirait que j'ai un problème avec quelque chose qui ne devrait pas être le cas ... Mais je voudrais demander de l'aide.

Il y a quelques explications ici sur la pile que je ne reçois pas.

Avoir deux classes simples où l'une se réfère à l'autre, comme ci-dessous;

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
}

J'obtiens l'erreur de compilation commentée. Quelqu'un peut-il me dire ce que je dois faire pour résoudre le cas?

Un grand merci à tout homme bon pour son aide!

17
RafalK

Comme indiqué correctement par vadian, vous devez créer un init dans de tels scénarios:

class MyOwn {
    let myUser: User
    var life: Int

    init() {
        self.myUser = User(name: "John", age: 100)
        self.life = myUser.age 
    }
}

Vous ne pouvez pas fournir de valeur par défaut pour une propriété stockée qui dépend d'une autre propriété d'instance.

18
Paulo Mattos

Vous devez déclarer la vie comme ceci:

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

Parce que vous essayez d'initialiser une propriété (variable) avec une autre pendant le processus d'initialisation. Pour le moment, les variables ne sont pas encore disponibles.

8
Eugene Laminskiy