Swift 错误无法读取数据,因为它丢失了

Swift Error The data can not be Read because it is missing

我正在尝试显示来自 API 的数据。这是 API Link .https://coinmap.org/api/v1/venues/ 。我想将 Vanues 数组字段的属性显示到 IOS app 中。我使用 Quick type 创建了模型。我使用像 self.vanues = respone.results.map{$0} 这样的地图,但结果仍然相同 这是模型。

import Foundation

// MARK: - Welcome
struct Coin: Codable {
    let venues: [Venue]
}

// MARK: - Venue
struct Venue: Codable {
    let id: Int
    let lat, lon: Double
    let category, name: String
    let createdOn: Int
    let geolocationDegrees: String

    enum CodingKeys: String, CodingKey {
        case id, lat, lon, category, name
        case createdOn = "created_on"
        case geolocationDegrees = "geolocation_degrees"
    }
}
 

我使用另一个 swift 文件将其转换为列表。这是代码。

import Foundation
struct VanueResponse: Decodable {
    let results: [Venue]
}

这是我的网络管理员。

import Foundation

class NetworkManager {
    
    func getCoins(from url: String, completion: @escaping (Result<VanueResponse, NetworkError>) -> Void ) {
        
        guard let url = URL(string: url) else {
            completion(.failure(.badURL))
            return
        }
        
        URLSession.shared.dataTask(with: url) { data, response, error in

            if let error = error {
                completion(.failure(.other(error)))
                return
            }

            if let data = data {
                //decode
                do {
                    let response = try JSONDecoder().decode(VanueResponse.self, from: data)
                    completion(.success(response))
                } catch let error {
                    completion(.failure(.other(error)))
                }
            }
        }
        .resume()
    }
    
    
}

这里是主持人class。

import Foundation

class VenuePresenter : VanueProtocol{

    // creating instance of the class
    private let view : VanueViewProtocol
    private let networkManager: NetworkManager
    private var vanues = [Venue]()
    var rows: Int{
        return vanues.count
    }
    // initilanize the class
    init(view:VanueViewProtocol , networkmanager:NetworkManager = NetworkManager()){
        self.view = view
        self.networkManager = networkmanager
    }
    
    
    func getVanue(){
        
        let url  = "https://coinmap.org/api/v1/venues/"
        
        networkManager.getCoins(from: url) { result in
            
            switch result {
            case.success(let respone):
                self.vanues = respone.results
                DispatchQueue.main.async {
                    self.view.resfreshTableView()
                }
            case .failure(let error):
                DispatchQueue.main.async {
                    self.view.displayError(error.localizedDescription)
                    print(Thread.callStackSymbols)
                }
            }
            
        }
    }
    
    
    

    func getId(by row: Int) -> Int {
        return vanues[row].id
    }
    
    func getLat(by row: Int) -> Double {
        return vanues[row].lat
    }
    
    func getCreated(by row: Int) -> Int {
        return vanues[row].createdOn
    }
    
    func getLon(by row: Int) -> Double? {
        return vanues[row].lon
    }
    
    
}


  

我设置断点并在控制台中找到它 windows .

这是我 运行 应用程序时的屏幕截图。

解码错误很明显:

根字典中的键是 venues(不是 results)所以正确的结构是 Coin.

getCoins 中用 Coin

替换两个出现的 VanueResponse