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

Raf*_*alK 18 properties class init lazy-initialization swift

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

这里有一些解释我没有得到.

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

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
}
Run Code Online (Sandbox Code Playgroud)

我得到了注释编译错误.请有人告诉我该怎么办才能解决这个案子?

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

Pau*_*tos 20

正如vadian正确指出的那样,你应该init在这样的场景中创建:

class MyOwn {
    let myUser: User
    var life: Int

    init() {
        self.myUser = User(name: "John", age: 100)
        self.life = myUser.age 
    }
}
Run Code Online (Sandbox Code Playgroud)

您不能为依赖于另一个实例属性的存储属性提供默认值.

  • 为什么我们可爱的 IDE 不建议这样做呢? (3认同)
  • 这个肯定可以解决我的问题。谢谢! (2认同)

Eug*_*kiy 7

您应该这样声明生活:

lazy var life:Int = {
    return self.myUser.age
}()
Run Code Online (Sandbox Code Playgroud)

因为您正在尝试在初始化过程中用另一个属性初始化一个属性(变量)。目前,变量尚不可用。

  • @PauloMattos答案中提出的代码体系结构至少对于我来说是可以接受的。但是我不能说为什么一个人需要他试图实现的架构。我只是告诉他如何做到没有编译错误,并解释了他的错误是什么 (2认同)