【问题标题】:property initializers run before 'self' is available error属性初始化程序在“自我”可用之前运行错误
【发布时间】:2021-09-13 01:32:09
【问题描述】:

我正在学习一个教程,并想自己将一项功能添加到倒数计时器中。但是,我得到了错误:

不能在属性初始化器中使用实例成员“timeRemaining”;属性初始化器在“self”可用之前运行

似乎造成问题的代码在这里:

@State private var timeRemaining: CGFloat = defaultTimeRemaining

var i = timeRemaining
    func timeString(time: TimeInterval) -> String {
            let minute = Int(time) / 60 % 60
            let second = Int(time) % 60

            return String(format: "%02i:%02i",  minute, second)
        }

对不起,如果这是一个基本问题/问题。这是我第一次使用 Xcode :)

【问题讨论】:

  • 初始值不能来自同一个struct/class中的另一个属性。它必须在带有参数或实际值的初始化程序中完成。所以将timeRemainingdefaultTimeRemaining 更改为实际数字或在初始化程序中进行
  • defaultTimeRemaining 之前设置为一个数字,如下所示:let defaultTimeRemaining: CGFloat = 63。是这个问题吗?
  • 由于显示的时间每秒都在变化(这是在 defaultTimeRemaining 变量中完成的)我需要函数的输出也更新
  • 这就是问题所在。试试这个改变@State private var timeRemaining: CGFloat = 0 然后在body 使用.onAppear(){timeRemaining = defaultTimeRemaining i = timeRemaining} 在最上面的View
  • 试试Apple SwiftUI Tutorials 所有这些都是非常基本的东西

标签: swift xcode self xcode12 initializer


【解决方案1】:

swift中的所有属性都必须在初始化之前设置。 考虑这段代码。

class MyObj {

     var value1 = 1
     var value2 = value1 + 1
     init(){}
}

swift中的init需要先设置value1和value2才能返回self

在这种情况下它不能,因为 value2 需要设置 self.value1 但 value1 需要设置 self 因为它是一个实例 var

考虑这段代码

class myObj {

  var value1 = 1
  lazy var value2: Int = {
      value1 + 1
  }()
  init(){}
}

这是一个例外,我们保证我们会在初始化后为实例 var 提供一个值。 为此,我们将其设置为惰性并提供在第一次访问时发生的闭包。

这就像强制展开一个值,但值的 init 是一个块。

如果在设置时不需要实例变量,也可以使用类方法或静态方法获取值。

var value2 = MyObj.onePlusOne()

class func onePlusOne() -> Int {
      1 + 1
}

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2017-09-18
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2021-04-03
    • 2021-10-05
    相关资源
    最近更新 更多