繁体   English   中英

在 SwiftUI 中访问数组中的元素时出现“致命错误:索引超出范围”

[英]“Fatal error: Index out of range” when accessing elements in an array, in SwiftUI

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

所以我首先创建了一个 Struct

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 function 和一个试图显示数组中的随机项的视图:

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 插入到数组中,在此设计中从“1 1”开始到“12 12”结束。

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

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

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

当 VStack 中的Text属性在VStack .onAppear (perform: InitializeTheTable) function 之前初始化时会出现此问题。 我想出了一个解决这个问题的想法在赚钱之前,你在 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM