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

Posted

技术标签:

【中文标题】属性初始化程序在 \'self\' 可用之前运行【英文标题】: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 中令人惊讶的限制:有什么想法为什么会这样? 【参考方案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 您的答案中提出的代码架构更容易接受,至少对我而言。但我不能说为什么一个人需要他试图实现的架构。我只是向他展示了如何在没有编译错误的情况下做到这一点并解释了他的错误

以上是关于属性初始化程序在 'self' 可用之前运行的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Maps - 不能在属性初始化器中使用实例成员;属性初始化程序在 'self' 可用之前运行

如何修复错误:@FetchRequest 中的“属性初始化程序在”自我“可用”之前运行

不能在属性初始化器中使用实例成员“pdfName”;属性初始化程序在“自我”可用之前运行

SwiftUI CS193P - 不能在属性初始化程序中使用实例成员“卡片”;属性初始化程序在“自我”可用之前运行

MKCoordinateSpan中的错误,表示在自我可用之前运行

如何使用属性作为 FetchRequest 谓词的参数