问题描述
我是 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()
}
}