Swift UI 问题显示来自解析的 json 的数据

问题描述

我是 swift 的新手,我根据一个我已经输入并知道可以工作的示例构建了一个简单的 ui,但是当我替换自己的数据并编写自己的模型时,它会崩溃。 我已经整理了我的 JSON,它是有效的。我的 UI 引发错误 Value of type 'Resorts' has no member 'items'。我遇到的问题是使用 ForEach 循环遍历 json 对象并显示 items.resortName

任何帮助都是巨大的!

这是我的代码

内容模型

import Foundation

class DataModel: ObservableObject {
    
    @Published var resorts = [Resorts]()
    
    init() {

        getLocalData()
    }
    
    func getLocalData() {
        
        // Get a url to the json file
        let jsonUrl = Bundle.main.url(forResource: "data",withExtension: "json")
        
        do {
            // Read the file into a data object
            let jsonData = try Data(contentsOf: jsonUrl!)
            
            // Try to decode the json into an array of modules
            let jsonDecoder = JSONDecoder()
            let resorts = try jsonDecoder.decode([Resorts].self,from: jsonData)
            
            // Assign parsed modules to modules property
            self.resorts = resorts
        }
        catch {
            // Todo log error
            print("Couldn't parse local data \(error)")
        }
        
    }
    
}

度假村

import Foundation

struct Resorts: Decodable,Identifiable {
    
    var id: Int
    var apiVersion: String
    var region: Region
    
}

struct Region: Decodable,Identifiable {
    
    var id: Int
    var name: String
    var items: [Items]
    
}

struct Items: Decodable,Identifiable {
    
    var id: Int
    var resortName: String
    var state: String
    
}

JSON 片段

[
    {
        "id":0,"apiVersion": "12.2","region": {
            "id": 0,"name": "Rocky Mountains","items": [
                {
                    "id": 0,"resortName": "A Basin","state": "Colorado","reportDateTime": "2021-06-05 06:25:00","resortStatus": "minutes","operationStatus": "8",...

内容视图

struct ContentView: View {
    @EnvironmentObject var model: DataModel

    var body: some View {
       
        Text("Hello")
        ScrollView {
            
            HStack {
                
                ForEach(model.resorts) { resort in
                    ZStack {
                        
                        Color.white
                            .cornerRadius(8)
                        vstack {
                            Text("Resort by name")
                            //                        Text(resort.items)
                        }
                        
                    }
                    .frame(width: 175,height: 100)
                    .shadow(color: Color.black.opacity(0.2),radius: 5,x: 0,y: 0)
                    
                }
                
            }
            
        }
        
    }
}

解决方法

您正在使用 Text(resort.items)。尝试使用 Text(resort.region.items)。 您的度假村没有物品

,

看起来我可能已经解决了我的问题。但我猜必须有一个更优雅的解决方案来深入研究对象的 JSON 数组,然后我所做的......

import SwiftUI

struct ContentView: View {
    
    @EnvironmentObject var model: DataModel
    
    var body: some View {
        
        ZStack{
            
            LinearGradient(gradient: Gradient(colors: [.white,.blue,.purple]),startPoint: .topLeading,endPoint: .bottomTrailing)
            
            ScrollView(.vertical,showsIndicators: false) {
                
                ZStack {
                    
                    ForEach(model.resorts) { resort in
                        
                        VStack {
                            Text("Resort by name")
                            Text(resort.region.name)
                            ForEach(Array(resort.region.items)) { ski in
                                
                                ZStack {
                                    
                                    Color.white
                                        .cornerRadius(8)
                                    
                                    Text(ski.resortName)
                                    
                                }
                                .frame(width: 175,height: 100)
                                .shadow(color: Color.black.opacity(0.2),radius: 5,x: 0,y: 0)
                                
                            }
                        }
                        
                    }
                    
                }
                
            }
            
        }.ignoresSafeArea()
        
    }
}