如何解决使用Codable解码JSON,然后填充我的SwiftUI
我是Swift和SwiftUI的新手。我目前正在通过hackingwithswift.com教自己如何编写代码(喜欢它!),我目前处于第60天,我被困在这里,不确定从这里开始做什么。
面临的挑战是使用Codable解码某些信息并填充SwiftUI。
我创建了一个与JSON匹配的结构,但是当我运行该应用程序时,我不断收到错误“ Fetch Failed:UnkNown Error”,因此我的UI不会更新。
有人会看一下我的代码,并提供有关我要去哪里的指针,以及为什么?非常感谢您的任何建议和帮助,非常感谢!代码在下面发布。
Cody
import SwiftUI
struct Response: Codable {
var results: [User]
}
struct User: Codable,Identifiable {
let id: String
let isActive: Bool
let name: String
let age: Int
let company: String
let email: String
let address: String
let about: String
let registered: String
let tags: [String]
struct FriendRole: Codable {
let id: String
let name: String
}
let friend: [FriendRole]
}
struct ContentView: View {
@State private var results = [User]()
var body: some View {
List(results,id: \.id) { item in
vstack(alignment: .leading) {
Text(item.name)
.font(.headline)
Text(item.address)
}
}
.onAppear(perform: loadData)
}
func loadData() {
guard let url = URL(string: "https://www.hackingwithswift.com/samples/friendface.json") else {
print("Invalid URL")
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data,response,error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(Response.self,from: data) {
dispatchQueue.main.async {
self.results = decodedResponse.results
}
return
}
}
print("Fetch Failed: \(error?.localizedDescription ?? "Unkown Error").")
}.resume()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
解决方法
我也是swiftUI的新手,这就是我通过使用可观察对象设法使其工作的方式
这里是结构,因为在json文件中有一个[一开始,您不必创建具有User数组的结构,您可以创建一个结构,然后创建该结构类型的变量作为数组
这是我的做法
我为结构创建了单独的文件,例如我为它们创建了另一个文件
这是我的结构文件
import Foundation
struct User : Codable,Identifiable {
let id : String
let isActive : Bool
let name : String
let age : Int
let company : String
let email : String
let address : String
let about : String
let registered : String
let tags = [String]()
let friends = [Friends]()
}
struct Friends : Codable {
let id : String
let name : String
}
我为可观察对象类创建了另一个文件
class JsonChannel : ObservableObject {
@Published var retVal = [User]()
func getInfo () {
guard let url = URL(string: "https://www.hackingwithswift.com/samples/friendface.json") else {return}
URLSession.shared.dataTask(with: url) { (data,resp,err) in
if let data = data {
DispatchQueue.main.async {
do {
self.retVal = try JSONDecoder().decode([User].self,from: data)
}
catch {
print(error)
}
}
}
}.resume()
}
}
这是我的contentView文件的内容
import SwiftUI
struct ContentView : View {
@ObservedObject var info = JsonChannel()
var body: some View {
VStack {
Button(action: {
self.info.getInfo()
}) {
Text("click here to get info")
}
List {
ForEach (self.info.retVal) { item in
VStack {
Text("\(item.name)")
Text("\(item.address)")
}
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。