数组元素的绑定变量的正确数据类型是什么
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)")
}
}
所以我要发送给 NextView
的 item
必须类似于 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
}
我有一个结构是数据集的一部分,如下所示:
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)")
}
}
所以我要发送给 NextView
的 item
必须类似于 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
}