2

私は唯一の真実の情報源である観察可能なオブジェクトを持っています:

class NetworkFetcher: ObservableObject {
    @Published var list: [Car] = [Car(id: UUID().uuidString, name: "Tesla"), Car(id: UUID().uuidString, name: "BMW")]

    func erase() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0) {
            self.list = []
        }
    }

    func add() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0) {
            self.list = [Car(id: UUID().uuidString, name: "Tesla S"), Car(id: UUID().uuidString, name: "BMW M3")]
        }
    }
}

ここに車があります:

struct Car: Identifiable, Hashable {
    var id: String
    var name: String
}

ここで、消去と追加 (リストを編集する関数) が機能し、すべて問題ありません。

struct ContentView: View {
    @ObservedObject var net: NetworkFetcher = NetworkFetcher()

    var body: some View {
        NavigationView {
            VStack {
                ListView(liste: self.$net.list, net: self.net)
                Button(action: {
                    self.net.erase()
                }) {
                    Text("erase")
                }
                Button(action: {
                    self.net.add()
                }) {
                    Text("add")
                }
            }
        }
    }
}

struct ListView: View {
    @Binding var liste: [Car]
    @ObservedObject var net: NetworkFetcher

    var body: some View {
        List {
            ForEach(liste.indices, id: \.self) { i in
                NavigationLink(destination: CarView(c: self.$liste[i], net: self.net)) {
                    Text(self.liste[i].name)
                }
            }
        }
    }
}

問題はここにあります:

struct CarView: View {
    @Binding var c: Car
    @ObservedObject var net: NetworkFetcher

    var body: some View {
        VStack {
            TextField("car name :", text: $c.name)
            Button(action: {
                self.net.erase()
            }) {
                Text("erase")
            }
            Button(action: {
                self.net.add()
            }) {
                Text("add")
            }
        }
    }
}

消去ボタンをクリックすると、メイン リストが空の配列に変わります。しかし、アプリがクラッシュし、次のエラーが発生します。

致命的なエラー:範囲外のインデックス: ファイル /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.8/swift/stdlib/public/core/ContiguousArrayBuffer.swift、444 行目

質問は :

  1. なんで ?
  2. それを解決する方法は?

敬具

4

1 に答える 1