索引超出范围 SwiftUI

Posted

技术标签:

【中文标题】索引超出范围 SwiftUI【英文标题】:Index out of range SwiftUI 【发布时间】:2020-05-27 21:07:42 【问题描述】:

我已经声明了一个结构体,它应该有一个 id 和一个字面量

struct Lit: Identifiable, Codable 
    var id      : Int
    var literal : String

这是我将 JSON 文件解码为列表的代码: JSON 文件包含 3 项

["id":0,"literal":"arda","id":0,"literal":"mecho","id":0,"literal":"dossi"]
class Literal: ObservableObject 

  @Published var lit = [Lit]()

  init() 
    loadLiteral()
  
  func loadLiteral()

    guard let url = URL(string: "http://biobeehive.com/Dossi.json") else return

    URLSession.shared.dataTask(with: url )  (data,_,_) in
      guard let data = data else return

      let pokemon200 = try! JSONDecoder().decode([Lit].self, from: data)

      DispatchQueue.main.async  
        self.lit  = pokemon200
        print("\(self.lit[0].literal)")
      
    .resume()

  

Bellow,我想在索引 0 处打印文字,它应该打印“arda”,但我得到了一个错误。(致命错误:索引超出范围:文件),即使我看到所有3 项存在且已通过。

struct ContentView: View 

  @ObservedObject var literal = Literal()

  var body: some View 

    VStack 

      Text("\(literal.lit.count)")   // Output is 3
      Text("\(literal.lit[0].literal)") //Crashing here

    

你能告诉我如何解决这个问题吗?

【问题讨论】:

之所以崩溃是因为在带有 JSON 数据的网络请求完成之前,lit 数组是空的。因此,第一次渲染视图时,它会尝试访问空数组的[0] 【参考方案1】:

试试这个:

原因:异步加载需要一些时间,出现view时没有加载数据,所以因为根本没有数据而崩溃。

struct ContentView: View 

    @ObservedObject var literal = Literal()

    var body: some View 

        VStack 
            if literal.lit.count > 0 
                Text("\(literal.lit.count)")   // Output is 3
                Text("\(literal.lit[0].literal)") //Crashing here
             else 
                Text("still loading...")
            
        
    

【讨论】:

非常感谢您的回答。这对我帮助很大。我的困惑是因为我正在加载 3,因此我认为它已经加载了。

以上是关于索引超出范围 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

索引超出范围的 SwiftUI 问题

SwiftUI:JSON 索引总是超出范围

索引超出范围 SwiftUI

SwiftUI 网格索引超出范围

表单中的 SwiftUI 选择器 - 索引超出范围

SwiftUI:从 ForEach 中删除项目导致索引超出范围