微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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()
        
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。