我有一个结构如下
struct ValidStruct : Identifiable{
var id: UUID
var isValid = true
}
字符串
然后,我有一个视图,它有一个 State 属性,该属性是ValidStruct的数组
struct ValidityDetailView: View {
@State var isValidCollection: [ValidStruct] = []
型
在这个视图中,有些地方我有类似于下面代码
var body: some View {
ScrollView{
LazyVStack{
let elt = detail["validObjects"] as! OrderedDictionary<String, Any>?
ForEach(0..<elt!.count){ index in
HStack{
Text("\(isValidCollection[index].isValid) ? "Not valid" : "Valid")")
.font(.title2)
.onTapGesture {
isValidCollection[index].isValid.toggle()
}
...
}
}
}
}.onAppear{
//initialize and populate isValidCollection array here
let elt = detail["validObjects"] as! OrderedDictionary<String, Any>?
isValidCollection = Array(repeating: ValidStruct(id: UUID(), isValid: false), count: elt!.count)
print(">>> isValidCollection count \($isValidCollection.count)")
}
}
型
上面的代码使预览崩溃。请问我做错了什么?
期望看到由垂直行的文本ui元素填充的预览
1条答案
按热度按时间xkrw2x1b1#
首先强制将可选的向下转换为可选的
字符串
是毫无意义的。
发生此错误的原因是,当第一次呈现视图时,
isValidCollection
为空,但ForEach
中的elt!.count
具有值,因此您会发生越界崩溃。请改为使用isValidCollection.count
并删除let elt = …
行型
其他注意事项:
isExpanded
更可能是isValid
。“id
声明为常量并将isValid
声明为false
会更有效,因为这似乎是默认值型
然后可以初始化数组
型