【问题标题】:"Fatal error: Index out of range" when accessing elements in an array, in SwiftUI在 SwiftUI 中访问数组中的元素时出现“致命错误:索引超出范围”
【发布时间】:2020-12-09 20:55:49
【问题描述】:

在 swiftUI 中,我试图创建一个包含乘法表中项目的数组。 (1 x 1 = 1、1 x 2 = 2 等),并将其中一些显示给用户。

所以我首先创建了一个结构体

struct TableItem {

        var serialNumber: Int

        var numberA: Int
        var numberB: Int

        var result: Int {
           return numberA * numberB
        }

        init(giveNumberA:Int, giveNumberB:Int, giveSerialNumber: Int) {
            self.numberA = giveNumberA
            self.numberB = giveNumberB
            self.serialNumber = giveSerialNumber
    }
 }

然后在 ContentView 中创建了 Initialization 函数,以及一个试图从数组中显示随机项的 View:

struct ContentView: View {

@State private var allTableItems = [TableItem]()

@State private var currentDebug = Int.random(in: 0...10)

let tableUpperLimit = 13


var body: some View {
    
    NavigationView{
        VStack{
            Text("\(allTableItems[currentDebug].numberA) * \(allTableItems[currentDebug].numberB) = ?")
                .padding()
                .font(.title)
            
            Text("some other texts")
        }
        .navigationBarTitle("edutainment")
        .onAppear(perform: InitializeTheTable)
        .navigationBarItems(trailing:
                            Button(action: InitializeTheTable) {
                                Text("Reset")
                                }
                        )
    }

    

}


func InitializeTheTable() {
    //Step 1: initialize the full table
    var initCounter = 0
    
    for i in 1 ..< tableUpperLimit {
        for j in i ..< tableUpperLimit {
            
            let tempItem  = TableItem(giveNumberA: i, giveNumberB: j, giveSerialNumber: initCounter)
            
            allTableItems.insert(tempItem, at: initCounter)
            
            //This is for debug purpose
            print("\(initCounter):  \(allTableItems[initCounter].numberA) * \(allTableItems[initCounter].numberB) = \(allTableItems[initCounter].result) \n")
            
            initCounter+=1
        }
    }
}

它在视图加载时调用 InitializeTheTable(),使用两个 for 循环将 itemm 插入数组,在此设计中从“11”开始到“1212”结束。

从控制台日志中,我可以看到大约 70 多个项目按预期插入到数组“allTableItems”中。

但是,在 VStack 中,当我尝试从数组中提取一个随机项 (index:currentDebug) 并显示为文本时,出现“致命错误:索引超出范围”。

代码可以构建,但会崩溃并且无法运行。想知道为什么数组出现“超出范围”错误?谢谢

【问题讨论】:

    标签: arrays swiftui


    【解决方案1】:

    VStack 中的Text 属性在.onAppear (perform: InitializeTheTable) 函数之前初始化时会出现此问题。 我想出了一个想法来解决这个问题 在赚钱之前,您在 Struct ContentView 中创建 2 个变量:

    @State private var numberA = 0 // <--- here
    @State private var numberB = 0 // <--- here
    

    然后在循环结束的 InitializeTheTable 函数中我们执行以下操作:

    numberA = allTableItems[currentDebug].numberA
    numberB = allTableItems[currentDebug].numberB
    

    要使用@State 为 numberA 和 numberB 赋值,这两个变量将在界面上刷新

    func InitializeTheTable() {
        //Step 1: initialize the full table
        var initCounter = 0
        
        for i in 1 ..< tableUpperLimit {
            for j in i ..< tableUpperLimit {
                
                let tempItem  = TableItem(giveNumberA: i, giveNumberB: j, 
    giveSerialNumber: initCounter)
                
                allTableItems.insert(tempItem, at: initCounter)
                
                //This is for debug purpose
                print("\(initCounter):  \(allTableItems[initCounter].numberA) * \ 
    (allTableItems[initCounter].numberB) = \(allTableItems[initCounter].result) \n")
                
                initCounter+=1
            }
        }
        
        numberA = allTableItems[currentDebug].numberA // <--- here
        numberB = allTableItems[currentDebug].numberB // <--- here
    }
    

    请更新代码

    Text("\(allTableItems[currentDebug].numberA) * \(allTableItems[currentDebug].numberB) = ?")
                .padding()
                .font(.title) // <-- Old
    Text("\(numberA) * \(numberB) = ?")
                .padding()
                .font(.title) // <-- New
    

    【讨论】:

    • 您好,感谢您提供的新解决方案,并指出问题出在哪里。很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多