#はじめに
SwiftUI のListで削除メソッドを作るときにアイテムを削除すると、ForEachで回していたUIコンポーネンツがIndex out of range のエラーを吐き出したので治し方を共有しておきます
##問題のコード
struct someView: View {
@State var animals: [String] = ["🐶", "🐱", "🐊"]
var body: some View {
List {
ForEach(0..<animals.count) { i in
HStack {
Text(self.animals[i])
.padding(.all)
Spacer()
}
}
.onDelete(perform: delete)
}
}
func delete(at offsets: IndexSet) {
animals.remove(atOffsets: offsets)
}
}
この時、左スワイプで列を削除すると、必ずanimals[i]が範囲外になってしまうんです…
これは0..<animals.count
が読み込まれた段階で判定されており、Binding要素ではないからだそうで。
参考
##解決法
ダイナミックに変更するにはidを指定すると良いとのこと
struct someView: View {
@State var animals: [String] = ["🐶", "🐱", "🐊"]
var body: some View {
List {
// id:\.self を指定する
ForEach(animals, id: \.self) { animal in
HStack {
Text(animal)
.padding(.all)
Spacer()
}
}
.onDelete(perform: delete)
}
}
func delete(at offsets: IndexSet) {
animals.remove(atOffsets: offsets)
}
}