web-dev-qa-db-ja.com

「self」が使用可能になる前にプロパティ初期化子が実行される

私はそうではない何かに問題があるようです...しかし、私はいくつかの助けを求めたいです。

ここに、私が得られないスタックについての説明があります。

以下のように、一方が他方を参照する2つの単純なクラスがある。

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
}

コメント付きのコンパイルエラーが表示されます。誰かが私にケースを解決するために何をすべきか教えてもらえますか?

助けてくれた善良な人に感謝します!

17
RafalK

vadianで正しく示されているように、このようなシナリオではinitを作成する必要があります。

class MyOwn {
    let myUser: User
    var life: Int

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

別のインスタンスプロパティに依存するdependストアドプロパティのデフォルト値を提供することはできません。

18
Paulo Mattos

次のように人生を宣言する必要があります。

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

初期化プロセス中に1つのプロパティ(変数)を別のプロパティ(変数)で初期化しようとしているためです。現時点では、変数はまだ使用できません。

8