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] : "")

ListForEach 表达式是安全的,因为如果数组为空则主体不会被执行。\

另一方面,if allWords.isEmpty 检查是没有意义的,因为 编译时 知道文件是否为空].

您在 onAppear 中调用了函数 StartGame()。在这种情况下 Text 首先加载然后调用您的函数。所以在加载 Text(String(allWords[1])) 时,allWordsNil

你应该按Text(allWords.count > 1 ? allWords[1] : "YourDefaultText")

处理

OnAppear 是在该视图出现时触发操作的视图。