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

kmbjn2e3  于 2023-08-02  发布在  Swift
关注(0)|答案(1)|浏览(119)

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

var exercise: [Exercise]

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

字符串
在我的代码(View1)中,我循环遍历exercise数组并到达每个元素,如下所示:

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中设置的项不匹配。你知道arrayItem必须是什么样的才能接受item值吗?
这是我得到的错误:
'NextView.Type'不可转换为'(Binding,Binding,Int)-> NextView'

ctrmrzij

ctrmrzij1#

其中一个解决方案是使用@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
}

相关问题