web-dev-qa-db-ja.com

SwiftUIの@BindingとForEach

SwiftUIで@BindingForEachと組み合わせて使用​​する方法を理解できません。ブール値の配列からTogglesのリストを作成するとします。

struct ContentView: View {
    @State private var boolArr = [false, false, true, true, false]

    var body: some View {
        List {
            ForEach(boolArr, id: \.self) { boolVal in
                Toggle(isOn: $boolVal) {
                    Text("Is \(boolVal ? "On":"Off")")
                }                
            }
        }
    }
}

配列内のブール値へのバインディングを各Toggleに渡す方法がわかりません。上記のコードでは、このエラーが発生します。

未解決の識別子「$ boolVal」の使用

そしてもちろん、これは私には問題ありません(もちろん)。私は試した:

struct ContentView: View {
    @State private var boolArr = [false, false, true, true, false]

    var body: some View {
        List {
            ForEach($boolArr, id: \.self) { boolVal in
                Toggle(isOn: boolVal) {
                    Text("Is \(boolVal ? "On":"Off")")
                }                
            }
        }
    }
} 

今回のエラーは:

「ForEach」でイニシャライザ「init(_:id:content :)」を参照するには、「Binding」が「Hashable」に準拠している必要があります

この問題を解決する方法はありますか?

14
superpuccio

(値だけでなく)Togglesの数も変更する必要がある場合は、これを考慮してください。ところで、ForEach {}ブロックは省略できます。

struct ContentView: View {
   @State var boolArr = [false, false, true, true, false]

    var body: some View {
        NavigationView {
            // id: \.self is obligatory if you need to insert
            List(boolArr.indices, id: \.self) { idx in
                    Toggle(isOn: self.$boolArr[idx]) {
                        Text(self.boolArr[idx] ? "ON":"OFF")
                }
            }
            .navigationBarItems(leading:
                Button(action: { self.boolArr.append(true) })
                { Text("Add") }
                , trailing:
                Button(action: { self.boolArr.removeAll() })
                { Text("Remove") })
        }
    }
}
0
Paul B