SwiftUI 列表和 URLSession + JSONDecode

SwiftUI List and URLSession + JSONDecode

大家好我是Swift的新手 求助为什么数据没有显示在List中?请帮我修复它。 我制作了一个模型数据,并从 URl 中获取数据并解析它

我的模型:

struct ResponseData:  Codable{
    var userId: String
    var id: String
    var title: String
    var body: String
}

我在内容视图中的代码:

import SwiftUI

struct ContentView: View {
    @State var responseData = [ResponseData]()
    
    var body: some View {
        List(responseData, id: \.id ) { item in
            Text("\(item.body)")
        }
        .task {
            await loadData()
        }
    }

    func loadData () async {
        
        let urlString = "https://jsonplaceholder.typicode.com/posts"
        guard let url = URL(string: urlString) else { return }
        
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else {return}
            guard error == nil else {return}
            do {
                let postData = try JSONDecoder().decode(ResponseData.self, from: data)
            } catch let error {
                print(error)
            }
        }.resume()
        
    }
}

代码中有很多问题。

最重要的是

  • 在结构中 userIdidInt
  • JSON根对象是一个数组,请注意起始[.
  • 您没有在收到数据后更新模型。

当你使用 async/await 时,无论如何都要 充分利用 模式。

JSONAPIreturnsposts,那么如何命名结构体Post?

struct Post: Codable, Identifiable {
    let userId: Int
    let id: Int
    let title: String
    let body: String
}

struct ContentView : View {
    
    @State var posts = [Post]()
    
    var body : some View {
        List(posts) { post in
            Text(post.body)
        }
        .task {
            do {
                posts = try await loadData()
            } catch {
                print(error)
            }
        }
    }
    
    func loadData() async throws -> [Post] {
        
        let urlString = "https://jsonplaceholder.typicode.com/posts"
        let url = URL(string: urlString)!
        
        let (data, _) = try await URLSession.shared.data(for: URLRequest(url: url))
        return try JSONDecoder().decode([Post].self, from: data)
    }
}