Thread 1: Fatal error: Index out of range with elements in the array
Thread 1: Fatal error: Index out of range with elements in the array
大家好,
我制作的数组有问题
这是代码:
import SwiftUI
struct ContentView: View {
@State private var allWords : [String] = []
func startGame() {
if let startWordsURL = Bundle.main.url(forResource: "start", withExtension: "txt") {
if let startWords = try? String(contentsOf: startWordsURL) {
allWords = startWords.components(separatedBy: "\n")
return
}
}
if allWords.isEmpty {
allWords = ["silkworm"]
}
fatalError("Could not load start.txt from bundle.")
}
var body: some View {
VStack{
Text(String(allWords[1]))
.onAppear(perform: startGame)
.font(.system(size: 30))
.frame(width: 1000, height: 75)
.background(Rectangle()
.foregroundColor(.white))
.border(Color.black, width: 1)
}
}
我在 Text(String(allWords[1])) 行出现致命错误
这告诉我我超出了范围,但是当我尝试使用例如 allWords.count 打印数组的大小时,它告诉我我有 11 个元素。
我的数组声明有问题吗?
先谢谢大家
这是一个常见的错误。第一次渲染视图时数组为空。
强烈建议 never 在视图的呈现区域中通过索引订阅获取数组的元素,除非它保证数组包含请求索引处的项目。
进行安全检查并且String
初始化程序是多余的
Text(allWords.count > 1 ? allWords[1] : "")
List
或 ForEach
表达式是安全的,因为如果数组为空则主体不会被执行。\
另一方面,if allWords.isEmpty
检查是没有意义的,因为 你 在 编译时 知道文件是否为空].
您在 onAppear 中调用了函数 StartGame()。在这种情况下 Text 首先加载然后调用您的函数。所以在加载 Text(String(allWords[1])) 时,allWords 是 Nil
你应该按Text(allWords.count > 1 ? allWords[1] : "YourDefaultText")
处理
OnAppear 是在该视图出现时触发操作的视图。
大家好,
我制作的数组有问题 这是代码:
import SwiftUI
struct ContentView: View {
@State private var allWords : [String] = []
func startGame() {
if let startWordsURL = Bundle.main.url(forResource: "start", withExtension: "txt") {
if let startWords = try? String(contentsOf: startWordsURL) {
allWords = startWords.components(separatedBy: "\n")
return
}
}
if allWords.isEmpty {
allWords = ["silkworm"]
}
fatalError("Could not load start.txt from bundle.")
}
var body: some View {
VStack{
Text(String(allWords[1]))
.onAppear(perform: startGame)
.font(.system(size: 30))
.frame(width: 1000, height: 75)
.background(Rectangle()
.foregroundColor(.white))
.border(Color.black, width: 1)
}
}
我在 Text(String(allWords[1])) 行出现致命错误 这告诉我我超出了范围,但是当我尝试使用例如 allWords.count 打印数组的大小时,它告诉我我有 11 个元素。
我的数组声明有问题吗?
先谢谢大家
这是一个常见的错误。第一次渲染视图时数组为空。
强烈建议 never 在视图的呈现区域中通过索引订阅获取数组的元素,除非它保证数组包含请求索引处的项目。
进行安全检查并且String
初始化程序是多余的
Text(allWords.count > 1 ? allWords[1] : "")
List
或 ForEach
表达式是安全的,因为如果数组为空则主体不会被执行。\
另一方面,if allWords.isEmpty
检查是没有意义的,因为 你 在 编译时 知道文件是否为空].
您在 onAppear 中调用了函数 StartGame()。在这种情况下 Text 首先加载然后调用您的函数。所以在加载 Text(String(allWords[1])) 时,allWords 是 Nil
你应该按Text(allWords.count > 1 ? allWords[1] : "YourDefaultText")
OnAppear 是在该视图出现时触发操作的视图。