如何从 Swift 中的另一个结构编辑一个结构中的数组?

How to edit an array in one struct from another struct in Swift?

我在名为 WorkoutBuilderView 的结构中有一个 "Workout Sets" 数组。我的问题是我需要从嵌套在 WorkoutBuilderView 中的结构访问该数组的内容(如下所示)。此结构不需要嵌套在 WorkoutBuilderView 中,但它是首选。我唯一真正需要的是能够从另一个结构编辑 sets 数组。

可能为结构创建 "inout" 类参数? (据我所知,这仅适用于方法)

代码:

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)
    }
}


}

如果我正确理解你的问题,@Binding 正是用于此目的

1) 将绑定变量添加到嵌套结构中,如

//layout (sets needs to pass through here too)
struct WorkoutSetLayout: View {
    let index: Int
    @Binding var data: [WorkoutSet]
    ...

2) 通过初始化器嵌套在父级中绑定模型,如

ForEach(self.sets) { set in
    WorkoutSetLayout(index: set.id, data: self.$sets)
}