Saya mulai dengan menambahkan beberapa bilangan bulat ke array di onAppear untuk tumpukan terluar saya. Tetapi ketika saya mencoba menampilkan isi array menggunakan ForEach, saya mendapatkan kesalahan indeks di luar jangkauan.

struct MyView: View {
    @State private var answers = [Int]()
    var body: some View {
        VStack {
            ForEach(0..<4) { number in 
            Text("\(answers[number])")
            }
        }
        .onAppear {
           for _ in (0..<4) {
               answerArray.append(Int.random(in: 1...10))
           }
        }
0
squarehippo10 25 Mei 2021, 22:39

2 jawaban

Jawaban Terbaik

onAppear dipanggil setelah MyView dimuat untuk pertama kalinya, dan pada saat itu, answers masih kosong. Itu sebabnya program Anda mogok di ForEach(0..<4), karena answers belum memiliki 4 elemen.

ForEach(0..<4) { number in 
    Text("\(answers[number])") /// answers is still empty.
}

Sebagai gantinya, Anda harus melihat ke answers.indices, sehingga answers[number] dijamin ada. Pastikan juga untuk memberikan id (id: \.self) untuk memenuhi persyaratan ForEach Identifiable.

struct MyView: View {
    @State private var answers = [Int]()
    var body: some View {
        VStack {
            ForEach(answers.indices, id: \.self) { number in
                Text("\(answers[number])")
            }
        }
        .onAppear {
            for _ in (0..<4) {
                answers.append(Int.random(in: 1...10)) /// you probably meant `answers.append`, not `answerArray.append`
            }
        }
    }
}
1
aheze 25 Mei 2021, 20:22

Jangan pernah mengambil item dengan indeks hard-code dalam ekspresi ForEach.

Lakukan count array, loop dilewati (aman) jika array kosong.

ForEach(0..<answers.count) { number in

Atau - masih lebih sederhana - menghitung item daripada indeks

ForEach(answers, id: \.self) { answer in 
    Text("\(answer)")
}
1
vadian 25 Mei 2021, 21:02