Ios 在SwiftUI中切换更改后更新数组

Ios 在SwiftUI中切换更改后更新数组,ios,swift,xcode,swiftui,Ios,Swift,Xcode,Swiftui,我在SwiftUI中有一个ScooterReservationView类: ... @State var extensionIDs: [Int] = [] var body: some View { ... List(scooterExtensionVM.extensions, id: \.self) { scooterExtension in ScooterExtensionRow(_extension: scooterExtension, exten

我在SwiftUI中有一个ScooterReservationView类:

...
@State var extensionIDs: [Int] = []

var body: some View {
    ...
    List(scooterExtensionVM.extensions, id: \.self) { scooterExtension in
            ScooterExtensionRow(_extension: scooterExtension, extensionIDs: self.$extensionIDs)
    }
...
scooterExtensionVM.extensions数组从API请求获取其值,扩展完全基于后端API动态。 然后是ScooteExtensionRow结构:

struct ScooterExtensionRow: View {

@EnvironmentObject var appState: AppState
@Binding var extensionIDs: [Int]

var scooterExtension: ScooterExtension
@State var isOn: Bool = true

init(_extension: ScooterExtension, extensionIDs: Binding<[Int]>) {
    self.scooterExtension = _extension
    self._extensionIDs = extensionIDs
}

var body: some View {
    HStack {
        Toggle(isOn: self.$isOn) {
            Text(scooterExtension.name)
        }
        .padding()
    }
}
struct ScooteExtensionRow:视图{
@EnvironmentObject变量appState:appState
@绑定变量扩展ID:[Int]
变量scooterExtension:scooterExtension
@状态变量:Bool=true
init(_扩展名:ScooteExtension,扩展名ID:Binding){
self.scooterExtension=\u扩展名
self.\u extensionId=extensionId
}
var body:一些观点{
HStack{
切换(isOn:self.$isOn){
文本(ScooteExtension.name)
}
.padding()
}
}
}

我的目标是在任何ScooterExtensionRow视图中的切换发生更改时更新ExtensionId数组。如果任何切换处于打开状态,我需要将ScooteExtension的扩展ID添加到该数组中,如果处于关闭状态,我需要从数组中删除该ID。这需要我稍后提交API请求。(我需要收集已启用/切换扩展的所有ID)

问题是:我在文档中看不到任何类型的切换回调操作,我可以在数组中追加/删除值,但在这个伟大的SwiftUI世界中,回调可能不是最好的方法


有谁能帮上忙吗?

啊,我明白你在评论中的意思了。为ID创建一个新的容器类型如何。差不多

class ExtensionID: Identifiable, ObservableObject {
    let id: Int
    var isOn: Bool = true

    init(id: Int) {
        self.id = id
    }
}
然后,您可以将切换绑定到
isOn
属性,并基于此有条件地显示ScooterExtensionRow(或者基于给定id的任何其他更改,这些更改是关闭的,而不是从数组中实际丢失的)


这有意义吗?

假设
ScooteExtension
有一个属性
id
,可以按如下方式执行:

切换(isOn:Binding(get:{self.isOn}),
集合:{
self.isOn=$0
如果$0{
self.extensionId.append(self.scooterExtension.id)
}否则{
self.extensionIDs=self.extensionIDs.filter{$0!=self.scooterExtension.id}
}
})) {
文本(ScooteExtension.name)
}

extensionID
是否可以折叠成
AppState
以存储(和发布)更新?我可以将extensionID放入AppState,但我认为这并不能解决我原来的问题,因为我无法在切换开关后向数组中添加/删除元素