Какой правильный тип данных для привязки переменной элемента массива
У меня есть структура, которая является частью набора данных, как показано ниже:
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'
1 ответ
Одним из решений может быть использование @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
}