粗体行(即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)
}
}
}
答案 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
。