属性初始化程序在“self”可用之前运行

时间:2017-04-21 19:43:58

标签: swift class properties init lazy-initialization

似乎我遇到了一些不应该出现问题的问题......但我想请一些帮助。

我在堆栈上有一些解释我没有。

有两个简单的类,其中一个引用另一个,如下所示;

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
}

我收到了评论编译错误。请有人告诉我该怎么办才能解决此案?

非常感谢任何好人的帮助!

2 个答案:

答案 0 :(得分:13)

正如 vadian 正确指出的那样,您应该在这种情况下创建init

class MyOwn {
    let myUser: User
    var life: Int

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

您无法为另一个实例属性上依赖的存储属性提供默认值。

答案 1 :(得分:5)

你应该宣布这样的生活:

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

因为您在初始化过程中尝试将一个属性(变量)初始化为另一个属性(变量)。此时变量尚不可用。