首页 > 解决方案 > 数组元素的绑定变量的正确数据类型是什么

问题描述

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

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)")
       }
}

所以item我将发送给NextView必须是类似的Exercise(id: E21, exercise: 227, set: 1)

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

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

上面的变量 ( arrayItem) 和我在View1. 知道接受价值arrayItem必须是什么样的吗?item

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

标签: swiftswiftuiswift-data

解决方案


解决方案之一是使用@ObservableObject并制作您的exercises清单@Published

首先,您需要一些类来存储您的练习:

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
}

推荐阅读