Какой правильный тип данных для привязки переменной элемента массива

У меня есть структура, которая является частью набора данных, как показано ниже:

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
}
Другие вопросы по тегам