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..<4)
这阻止了它崩溃,但这只是因为它认为数组中没有元素。
没错,数组中没有没有元素,至少一开始是……
【参考方案1】:
永远不要通过ForEach
表达式中的硬编码索引检索项目。
对数组执行count
,如果数组为空,则(安全地)跳过循环。
ForEach(0..<answers.count) number in
或者 - 更简单 - 枚举项目而不是索引
ForEach(answers, id: \.self) answer in
Text("\(answer)")
【讨论】:
【参考方案2】:onAppear
在MyView
首次加载后调用,此时answers
仍然为空。这就是你的程序在ForEach(0..<4)
崩溃的原因,因为answers
还没有4 个元素。
ForEach(0..<4) number in
Text("\(answers[number])") /// answers is still empty.
相反,您应该查看answers.indices
,以便保证answers[number]
存在。确保还提供一个 id (id: \.self
) 以满足 ForEach
的 Identifiable
要求。
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 - 索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章