[英]Fatal Error : Array index out of range when accessing an array of 10 elements in Swift
[英]“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.