3条回答 默认 最新
GISer Liu 2024-02-25 20:41关注该回答引用自GPT-3.5,由博主GISer Liu编写:
问题分析:
在SwiftUI中,如果我们想要在ForEach中使用Binding数组,但是数组的元素是结构体并且实现了Identifiable协议时,会遇到编译错误。
解决方案:
要解决这个问题,我们可以通过创建一个绑定数组的包装器来实现。我们可以创建一个包装器来存储我们的结构体数组,并使用Binding将其包装起来,以便在ForEach中使用。
具体步骤如下:- 创建一个包装器结构体,该结构体具有一个属性来存储结构体数组,并使用Binding将其包装起来。
- 在ForEach中使用该包装器的绑定数组。
下面是代码示例:
swiftCopy code
在这个示例中,我们首先创建了一个名为BindingArray的结构体,它包装了一个结构体数组,并提供了对该数组的Binding访问。然后,我们在ContentView中使用了这个BindingArray来遍历items数组,并在ForEach中使用Binding。import SwiftUI // 创建一个包装器结构体来存储结构体数组 struct BindingArray<Element>: RandomAccessCollection { private var array: [Element] var bindings: [Binding<Element>] init(_ array: [Element]) { self.array = array self.bindings = array.map { Binding.constant($0) } } var startIndex: Int { array.startIndex } var endIndex: Int { array.endIndex } subscript(index: Int) -> Element { get { array[index] } set { array[index] = newValue } } subscript(index: Int) -> Binding<Element> { bindings[index] } } // 示例结构体 struct Item: Identifiable { let id: UUID var name: String } struct ContentView: View { @State private var items: [Item] = [ Item(id: UUID(), name: "Item 1"), Item(id: UUID(), name: "Item 2"), Item(id: UUID(), name: "Item 3") ] var body: some View { VStack { ForEach(BindingArray(items), id: \.id) { $item in TextField("Enter item name", text: $item.name) } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
