【问题标题】:SwiftUI - Index out of rangeSwiftUI - 索引超出范围
【发布时间】:2021-05-25 19:39:40
【问题描述】:

我首先将一些整数添加到 onAppear 中最外层堆栈的数组中。但是当我尝试使用 ForEach 显示数组的内容时,我得到一个索引超出范围的错误。

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))
           }
        }

【问题讨论】:

  • 使用ForEach(answers.indices) 而不是ForEach(0..&lt;4)
  • 这阻止了它崩溃,但这只是因为它认为数组中没有元素。
  • 没错,数组中没有没有元素,至少一开始是……

标签: arrays foreach swiftui


【解决方案1】:

永远不要通过ForEach 表达式中的硬编码索引检索项目。

对数组执行count,如果数组为空,则(安全地)跳过循环。

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

或者 - 更简单 - 枚举项目而不是索引

ForEach(answers, id: \.self) { answer in 
    Text("\(answer)")
}

【讨论】:

    【解决方案2】:

    onAppearMyView 首次加载后调用,此时answers 仍然为空。这就是你的程序在ForEach(0..&lt;4) 崩溃的原因,因为answers 还没有4 个元素。

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

    相反,您应该查看answers.indices,以便保证answers[number] 存在。确保还提供一个 id (id: \.self) 以满足 ForEachIdentifiable 要求。

    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`
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      相关资源
      最近更新 更多