我已经声明了一个结构,该结构应该具有一个id和一个litereal
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()
}
}
同上,我想在索引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
}
}
您能告诉我如何解决吗?
答案 0 :(得分:1)
尝试:
原因:异步加载会花费一些时间,并且在显示视图时不会加载数据,因此会崩溃,因为根本没有数据。
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...")
}
}
}
}