SwiftUI - 索引超出范围

Posted

技术标签:

【中文标题】SwiftUI - 索引超出范围【英文标题】:SwiftUI - Index out of range 【发布时间】: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) 这阻止了它崩溃,但这只是因为它认为数组中没有元素。 没错,数组中没有没有元素,至少一开始是…… 【参考方案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`
            
        
    

【讨论】:

以上是关于SwiftUI - 索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

索引超出范围的 SwiftUI 问题

SwiftUI:JSON 索引总是超出范围

索引超出范围 SwiftUI

SwiftUI 网格索引超出范围

表单中的 SwiftUI 选择器 - 索引超出范围

SwiftUI:从 ForEach 中删除项目导致索引超出范围