数组元素的绑定变量的正确数据类型是什么

What is the correct data type for binding variable of an array's element

我有一个结构是数据集的一部分,如下所示:

var exercise: [Exercise]

struct Exercise: Codable {
    var id = UUID()
   var exercise, set: Int
}

在我的代码 (View1) 中,我循环遍历练习数组并到达每个元素,如:

ForEach(exercise, id: \.id){ item in
       NavigationLink( destination: NextView(arrayItem: item)){
            Text("\(item.exercise)")
       }
}

所以我要发送给 NextViewitem 必须类似于 Exercise(id: E21, exercise: 227, set: 1)

NextView我不知道如何定义这个绑定变量。我试过这个:

struct NextView: View {
     @Binding var arrayItem: Exercise
}

上面的变量(arrayItem)与我在View1中设置的项目不匹配。 知道接受 item 值的 arrayItem 必须是什么样子吗?

这是我得到的错误: 'NextView.Type' is not convertible to '(Binding<Exercise>, Binding<String>, Int) -> NextView'

其中一个解决方案是使用 @ObservableObject 并使您的 exercises 列表 @Published.

首先你需要一些class来存储你的练习:

class ViewModel: ObservableObject {
    @Published var exercises = [
        Exercise(exercise: 227, set: 1),
        Exercise(exercise: 13, set: 2),
        Exercise(exercise: 423, set: 2)
    ]
}

在 NavigationLink 中,您传递所选项目的绑定 - 您可以这样做,因为您现在 观察 ViewModel

struct ContentView: View {
    @ObservedObject var viewModel = ViewModel()

    var body: some View {
        NavigationView {
            List {
                ForEach(viewModel.exercises, id: \.id) { item in
                    NavigationLink(destination: NextView(exercise: self.$viewModel.exercises[self.viewModel.exercises.firstIndex(of: item)!])) {
                        Text("\(item.exercise)")
                    }
                }
            }
        }
    }
}

NextView 中,您可以根据需要使用 @Binding 变量(我尝试修改 exercise.exercise 值:

struct NextView: View {
    @Binding var exercise: Exercise

    var body: some View {
        Text("Exercise: \(exercise.exercise)")
            .onTapGesture {
                self.exercise.exercise += 1
        }
    }
}

最后,您的模型需要符合 Equatable - 没有它您不能使用 firstIndex(of:)

struct Exercise: Codable, Equatable {
    var id = UUID()
    var exercise, set: Int
}