【SwiftUI】構造体の配列の要素を消すとIndexOutOfRangeが出た話

SwiftUIで入力データを保持する構造体を作った。

struct Gym:Identifiable,Codable {
    var id: Int = 0
    var Menu:String = ""
    var WeightString:String = ""
    var WeightInt:Int = 0
    var Kaisu:Int = 0
    var Setsu:Int = 0
}

この構造体を以下のようにBindingさせて使っていた。

struct InputView:View {
    @Binding var input:Gym
    
    var body:some View{
            TextField("種目を入力してね", text: $input.Menu)
   }

入力データは1つだけではなく、増やしたり減らしたりしたいので、構造体Gymの配列inputsを宣言して以下のように使う。

       ScrollView{
                ForEach(0..<inputs.count, id: \.self){i in
                    InputView(input: inputs[i], idx: i)
                }
            }

この状態で構造体の配列を1つ削除するとクラッシュする。(要素を追加するのはOK)

inputs.removeLast()

解決策としては、構造体ではなくObservableを継承したクラスにして、@Bindingから@Observedに変更すれば良い。

class Gym:Identifiable,Codable,ObservableObject {
    var id: Int = 0
    var Menu:String = ""
    var WeightString:String = ""
    var WeightInt:Int = 0
    var Kaisu:Int = 0
    var Setsu:Int = 0
}
@ObservedObject var input:Gym

参考:

https://www.yururiwork.net/【swiftui】謎のindex-out-of-rangeクラッシュで苦戦した話/

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog