【发布时间】: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) 并显示为文本时,出现“致命错误:索引超出范围”。
代码可以构建,但会崩溃并且无法运行。想知道为什么数组出现“超出范围”错误?谢谢
【问题讨论】: