【问题标题】:Property initializers run before 'self' is available属性初始化程序在 'self' 可用之前运行
【发布时间】:2017-09-18 22:25:54
【问题描述】:

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

这里有一些关于堆栈的解释我不明白。

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

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
}

我收到注释编译错误。有人可以告诉我应该怎么做才能解决这个问题吗?

【问题讨论】:

  • 将代码放入方法中。您不能在类的顶层初始化相互依赖的属性。或者使用计算属性。顺便说一句:User 类中的 lazy 属性是无用的。
  • @vadian,感谢您的帮助。
  • 这是swift 中令人惊讶的限制:有什么想法为什么会这样?

标签: swift class properties init lazy-initialization


【解决方案1】:

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

class MyOwn {
    let myUser: User
    var life: Int

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

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

【讨论】:

  • 这个肯定能解决我的问题。谢谢!
  • 为什么我们可爱的 IDE 不提出这个?
【解决方案2】:

你应该这样声明生活:

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

因为您在初始化过程中试图用另一个属性(变量)初始化。目前还没有可用的变量。

【讨论】:

  • 应该可以正常工作,但使用lazy 是不是有点矫枉过正? ;-)
  • @PauloMattos 您的答案中提出的代码架构更容易接受,至少对我而言。但我不能说为什么一个人需要他试图实现的架构。我只是向他展示了如何在没有编译错误的情况下做到这一点并解释了他的错误
猜你喜欢
  • 2021-10-05
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2020-07-18
  • 2021-04-03
  • 2021-05-16
相关资源
最近更新 更多