SwiftUI“无法在属性初始化程序中使用实例成员'numberOfDevice';属性初始化程序在'self'可用之前运行”错误

时间:2020-07-04 11:24:39

标签: swiftui

粗体行(即var文本: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)
        }
    }
}

3 个答案:

答案 0 :(得分:2)

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

尝试以下操作:

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属性。

答案 1 :(得分:1)

您可以使用简写形式的只读计算属性。

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

答案 2 :(得分:0)

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

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

什么是懒惰?

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

为什么?

当您致电numberOfDevice时,您实际上是在致电self.numberOfDevice,但是敏捷的智能足以使您不必显式编写self关键字。

这里的问题是,self在为变量分配值时尚未初始化。

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