swift 属性初始值设定项在“self”可用之前运行

pdsfdshx  于 2023-02-28  发布在  Swift
关注(0)|答案(3)|浏览(380)

好像我遇到了一些不应该出现的问题......但是我想寻求一些帮助。
堆栈中有一些解释我不明白。
有两个简单的类,其中一个引用另一个,如下所示:

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
}

我得到了注解编译错误。有人能告诉我该怎么做才能解决这个问题吗?

omtl5h9j

omtl5h9j1#

正如vadian正确指出的那样,您应该在以下场景中创建init

class MyOwn {
    let myUser: User
    var life: Int

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

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

gojuced7

gojuced72#

你应该这样宣告生命:

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

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

zazmityj

zazmityj3#

对我有效的方法是将变量转换为计算属性

// Previous declaration
var temperatureString = String(format:"%.1f", temperature) // "Cannot use instance member 'temperature' within property initializer; property initializers run before 'self' is available" 

// Computed Property
var temperatureString : String { 
   return String(format:"%.1f", temperature)
}

相关问题