【问题标题】:SwiftUI: JSON index always out of rangeSwiftUI:JSON 索引总是超出范围
【发布时间】:2020-04-26 09:24:41
【问题描述】:

我想知道为什么我的索引总是超出范围。我正在尝试在本地解析 JSON。这是我的代码。谢谢。

文章模型

struct Article: Decodable {
    let title: String
    let snapshot: String
}

解析 JSON

class TopicsViewModel: ObservableObject {
@Published var articles = [Article]()

func getArticles(selectedTopic: Int) {
    switch selectedTopic {
    case 0:
        self.articles = try! JSONDecoder().decode([Article].self, from: JSON.data(using: .utf8)!)
    default:
        articles = []
    }
}
}

我在Appear上加载数据

.onAppear{
            self.topicsVM.getArticles(selectedTopic: self.whichTopic)
    }

这是错误开始

Text(topicsVM.articles[0].title).foregroundColor(Color.black)

First image, showing Model and Parse function

Second image, showing Text

【问题讨论】:

  • 如果self.whichTopic 不是0 你肯定会遇到这个问题?
  • 不,在这种情况下假设 whichTopic (self.whichTopic) 始终为 0。当 I Text(String(self.articles.count)) 时,它始终返回正确的大小。但不知什么原因,我无法访问索引。就像,如果我想访问第零个项目,它总是返回索引超出排列...
  • 那么必须发生的是getArticles 在数据显示在列表中之前被调用。通过拥有一些@State 属性来防止这种情况,例如,称为isLoaded 来跟踪这一点。如果您想要完整的答案,请告诉我。
  • 这是我的完整代码。你有什么主意吗?谢谢你。 pastebin.com/mM1gcbvK

标签: ios swift xcode swiftui


【解决方案1】:

要解决您的问题,您可以在 TopicsView 中执行此操作:

init(whichTopic: Int) {
    self.whichTopic = whichTopic
    self.topicsVM.getArticles(selectedTopic: self.whichTopic)
}

这将确保您的文章数组在构建视图之前具有您期望的数据。
尽管如此,你还是应该在你的列表中这样做:

                if topicsVM.articles.count > 0 {
                    Text(topicsVM.articles[0].title).foregroundColor(Color.black)
                }

索引超出范围的原因,似乎是因为在构造视图后填充了“topicsVM.articles”数组。当然,空数组没有 [0] 元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多