【问题标题】:SwiftUI "Cannot use instance member 'numberOfDevice' within property initializer; property initializers run before 'self' is available" errorSwiftUI“不能在属性初始化器中使用实例成员'numberOfDevice';属性初始化器在'self'可用之前运行”错误
【发布时间】:2020-10-24 22:50:14
【问题描述】:

粗体线(即 var text: String...)给出“不能在属性初始化程序中使用实例成员 'numberOfDevice';属性初始化程序在 'self' 可用之前运行”错误。我需要初始化吗?如果是在哪里?有不同的解决方案吗?

struct PairView: View {
    var theClass = BluetoothManager()   
    init() {theClass.viewDidLoad()}     

    var body: some View {
        List {
            ForEach(0..<BluetoothManager.peripheralArray.count) {   number in  //iterates thru 0 to array's count
            ConnectionView(numberOfDevice: number)      // create a ConnectionView for each number
        }
     }
  }
}

//-------

struct ConnectionView: View {
    
    var numberOfDevice: Int
    **var text: String = (BluetoothManager.peripheralArray[numberOfDevice]?.name)!**  
    // 'name' is a String property of the B.M. class's array's 'numberOfDevice index.'

    var body: some View {
        ZStack{
            RoundedRectangle(cornerRadius: 10.0).fill(Color.blue)
            Text(text).foregroundColor(Color.black)
        }
    }
}

【问题讨论】:

  • stackoverflow.com/questions/43550813/… 这应该会有所帮助
  • 您能否提供有关您的 BluetoothManager 和 peripheralArray 的更多信息,其中存储了哪些对象?该对象可以识别吗?

标签: swiftui


【解决方案1】:

您遇到的错误意味着您不能使用numberOfDevice 变量来实例化另一个变量。但是,您可以使用传递给 init 方法的 number

尝试以下方法:

struct ConnectionView: View {
    
    var numberOfDevice: Int
    var text: String
    
    init(numberOfDevice: Int) {
        self.numberOfDevice = numberOfDevice
        self.text = (BluetoothManager.peripheralArray[numberOfDevice]?.name)!
    }
    ...
}

注意:我不建议强制展开 (!)。如果可能,请尝试提供默认值。

另外,BluetoothManager 看起来像一个type,而不像一个类的instance。确保您访问的是有效对象的 peripheralArray 属性,而不是 BluetoothManager 类型的属性。

【讨论】:

  • 感谢您提供此解决方案,效果很好(@IFTTT 也解决了)。
【解决方案2】:

您可以为此使用lazy 关键字:

lazy var text: String = (BluetoothManager.peripheralArray[numberOfDevice]?.name)!

什么是懒惰?

lazy 表示它将推迟初始化,直到有人调用该变量,如果 self 未初始化,则不可能。因此,您将确定self 在访问该值之前已准备就绪。

为什么?

当你调用numberOfDevice时,你实际上是在调用self.numberOfDevice,但是swift足够聪明,可以让你不用显式写self关键字。

这里的问题是,当您为变量赋值时,self 尚未初始化。

因此,您需要确保变量在访问self之前已初始化。

【讨论】:

  • 我曾尝试使用许多类似问题中推荐的lazy,但是代码周围出现了很多其他错误,这就是我问这个问题的主要原因。不过,谢谢!
【解决方案3】:

您可以使用速记的只读计算属性。

var text: String { 
       return (BluetoothManager.peripheralArray[numberOfDevice]?.name)!
}  

【讨论】:

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