У меня есть массив «Наборов тренировок» в структуре под названием WorkoutBuilderView . Моя проблема заключается в том, что мне нужно получить доступ к содержимому этого массива из структуры, вложенной в WorkoutBuilderView (как показано ниже). Эту структуру не нужно вкладывать в WorkoutBuilderView , но она предпочтительна. Единственное, что мне действительно нужно, - это возможность редактировать массив sets из другой структуры.
Возможно создать параметр типа inout для структуры? (насколько мне известно, это работает только в методах)
- Массив, к которому необходимо получить доступ, называется sets .
- Местоположение, в котором он находитсянеобходимо получить доступ помечен комментарием // точка доступа
код:
struct WorkoutBuilderView: View {
@State var sets = [WorkoutSet(id: 0, percentage: -1, repetitions: -1, alteredValue: .max)]
var body: some View {
Background {
Group {
...
if self.sets.count > 0 {
ScrollView {
ForEach(self.sets) { set in
WorkoutSetLayout(index: set.id) //where sets needs to be passed in
}
}
}
...
}
}
}
//this is the struct where the array needs to be accessed
struct BuilderPicker: View {
let name: String
let options: Array<String>
let setIndex: Int
@State var selectedOption = 0
var body: some View {
HStack {
...
}
.onReceive([self.selectedOption].publisher.first()) { (value) in
//change sets here
//access point
print(value)
}
}
}
//layout (sets needs to pass through here too)
struct WorkoutSetLayout: View {
let index: Int
var body: some View {
VStack(alignment: .leading) {
Text("Set \(index + 1)")
...
//the array needs to go into the BuilderPicker where it will be edited
BuilderPicker(name: "Weight % of", options: [AlteredValue.max.rawValue, AlteredValue.weight.rawValue], setIndex: index)
...
}
}
}
//you probably don't need to worry about the Background
struct Background<Content: View>: View {
private var content: Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content()
}
var body: some View {
EmptyView()
.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
.overlay(content)
.padding(.top, 75)
}
}
}