在 swiftUI 上循环切换

loop on toggle on swiftUI

我是 swiftUI 的初学者,我想从结构数组生成切换。

我的结构:

struct Provider : Identifiable  {
    var id:Int
    var name:String
    var isOn:Bool 
}

和我的观点

import SwiftUI

struct ContentView: View {
    @State private var providers:[Provider] = [Provider(id: 8, name: "Netflix", isOn: true), Provider(id: 564,name:"SALTO",isOn: false), Provider(id: 350, name: "Apple Tv Plus", isOn: false)]
   
    var body: some View {
        VStack{
            ForEach (providers) {provider  in
                Toggle(isOn: .constant($provider.isOn), label: {
                Text("\(provider.name.capitalized)")
                })
           }
        }
    }   
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我不知道去绑定符号放在哪里


但如果这样做:

VStack{
    Toggle(isOn: $providers[0].isOn, label: {
        Text("\(providers[0].name.capitalized)")
    })             
}

这也是工作! 感谢您的帮助。

在上一个示例中,您了解了它的基础知识——能够修改 providers 数组的最简单方法是为其创建一个索引。这里有两种方法可以实现:

struct ContentView: View {
    @State private var providers:[Provider] = [Provider(id: 8, name: "Netflix", isOn: true), Provider(id: 564,name:"SALTO",isOn: false), Provider(id: 350, name: "Apple Tv Plus", isOn: false)]
    
    var body: some View {
        VStack {
            ForEach(providers.indices) { providerIndex  in
                Toggle(isOn: $providers[providerIndex].isOn) {
                    Text("\(providers[providerIndex].name.capitalized)")
                }
            }
        }
    }
}
struct ContentView: View {
    @State private var providers:[Provider] = [Provider(id: 8, name: "Netflix", isOn: true), Provider(id: 564,name:"SALTO",isOn: false), Provider(id: 350, name: "Apple Tv Plus", isOn: false)]
    
    var body: some View {
        VStack {
            ForEach(Array(providers.enumerated()), id: \.1.id) { (index,provider)  in
                Toggle(isOn: $providers[index].isOn) {
                    Text("\(provider.name.capitalized)")
                }
            }
        }
    }
}

第二种是我的首选方式,因为您将 provider 作为参数之一。庞大的集合存在轻微的性能问题,此时您可能想要从 Swift Algorithms.

探索 indexed