首页 > 解决方案 > API 未在 Swift for iOS 中显示数据

问题描述

目前没有从 API 获取数据来显示。

当前代码:

import SwiftUI

struct Response: Decodable {
    var content: [Result]
}

struct Result : Decodable {
    var code: String
    var fire: String
    var name: String
    var police: String
    var medical: String
}

struct ContentView: View {
    @State private var content = [Result]()

    var body: some View {
        List(content, id: \.code) { item in
            VStack(alignment: .leading) {
                Text(item.name)
                    .font(.headline)
                Text(item.medical)
            }
        }
        .onAppear(perform: loadData)
    }
    func loadData() {
        
        let url = URL(string: "https://emergency-phone-numbers.herokuapp.com/country/gb")!

        URLSession.shared.dataTask(with: url) { data, response, error in
            if let error = error { print(error); return }
            do {
                let decodedResponse = try JSONDecoder().decode(Response.self, from: data!)
                // we have good data – go back to the main thread
                DispatchQueue.main.async {
                    // update our UI
                    self.content = decodedResponse.content
                }
                
            } catch {
                print(error)
            }
        }.resume()
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

当前错误:

2021-01-21 19:21:07.094582+0000 iTunes API[39924:1098972] [] nw_protocol_get_quic_image_block_invoke dlopen libquic keyNotFound(CodingKeys(stringValue: "content", intValue: nil), Swift.DecodingError.Context(codingPath: [] ,debugDescription:“没有与键 CodingKeys 关联的值(stringValue:“content”,intValue:nil)(“content”)。”,underlyingError:nil))

请指教。提前致谢。

标签: iosswift

解决方案


请注意,来自的内容https://emergency-phone-numbers.herokuapp.com/country/gb是:

{"code":"GB","fire":"999","police":"999","name":"United Kingdom","medical":"999"}

content问题是您得到的响应中没有任何内容,因此JSONDecoder无法解析响应。您获得的响应似乎包含适合的内容Result,因此如果您更改代码以解析它,它可以正常工作:

import SwiftUI

struct Response: Decodable {
    var content: [Result]
}

struct Result : Decodable {
    var code: String
    var fire: String
    var name: String
    var police: String
    var medical: String
}

struct ContentView: View {
    @State private var content = [Result]()

    var body: some View {
        List(content, id: \.code) { item in
            VStack(alignment: .leading) {
                Text(item.name)
                    .font(.headline)
                Text(item.medical)
            }
        }
        .onAppear(perform: loadData)
    }
    func loadData() {
        
        let url = URL(string: "https://emergency-phone-numbers.herokuapp.com/country/gb")!

        URLSession.shared.dataTask(with: url) { data, response, error in
            if let error = error { print(error); return }
            do {
                let decodedResponse = try JSONDecoder().decode(Result.self, from: data!)
                // we have good data – go back to the main thread
                DispatchQueue.main.async {
                    // update our UI
                    self.content = [decodedResponse]
                }
                
            } catch {
                print(error)
            }
        }.resume()
        
    }
}

我想,最后,您可能希望 s 的集合Result适合content,因此您可能需要更改您的 API 上的某些内容以返回该集合,然后您的代码就可以正常工作。


推荐阅读