swift - 数组元素的绑定变量的正确数据类型是什么
问题描述
我有一个结构,它是数据集的一部分,如下所示:
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'
解决方案
解决方案之一是使用@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
}
推荐阅读
- css - 从奇数行的 flexbox 多行内容中删除间隙
- java - Spring Boot 中的库不匹配问题
- compression - 哪种算法最适合大文本压缩?
- mysql - laradock_mysql 不会启动和退出(1)
- c# - C# 7.3 Enum 约束:为什么我不能使用 enum 关键字?
- vba - 即使没有将新行添加到表中,代码也会运行 - Excel VBA
- java - Hibernate 不创建表
- php - 如何在 gatsby 中使用 Directus
- php - 我怎样才能让 CheckOut 日期总是更大和最大然后是 php 中的 Checkin 日期
- javascript - VuetifyJS 中的“TypeError:_vm.$refs.dialog.save 不是函数”