SwiftUIで@Binding
をForEach
と組み合わせて使用する方法を理解できません。ブール値の配列からToggle
sのリストを作成するとします。
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」に準拠している必要があります
この問題を解決する方法はありますか?
(値だけでなく)Toggle
sの数も変更する必要がある場合は、これを考慮してください。ところで、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") })
}
}
}