Как правильно отформатировать мои структуры в API, который я использую? - PullRequest
0 голосов
/ 01 марта 2020

Я использую API Aplhadvantage. Его структура:

{
    "Global Quote": {
        "01. symbol": "MSFT",
        "02. open": "152.4100",
        "03. high": "163.7100",
        "04. low": "152.0000",
        "05. price": "162.0100",
        "06. volume": "96388312",
        "07. latest trading day": "2020-02-28",
        "08. previous close": "158.1800",
        "09. change": "3.8300",
        "10. change percent": "2.4213%"
    }
}

Я уже создал свои структуры:

import Foundation

struct StockResponse: Decodable{
    var response: Stocks
}

struct Stocks: Decodable{
    var stocks: [StockInfo]
}

struct StockInfo: Decodable{
    var open: String
    var high: String
    var low: String
    var close: String
    var volume: String
}

И мой декодер:

    func getStock (completion: @escaping(Result<[StockInfo], StockError>) -> Void) {
        let dataTask = URLSession.shared.dataTask(with: resourceURL) { data, _,_ in
            guard let jsonData = data else{
                completion(.failure(.noDataAvailable))
                return
            }
            do{
                let decoder = JSONDecoder()
                let stocksResponse = try decoder.decode(StockResponse.self, from: jsonData)
                let stockDetails = stocksResponse.response.stocks
                completion(.success(stockDetails))
            }
            catch{
                completion(.failure(.canNotProcessData))
            }
        }
        dataTask.resume()
    }

Каждый раз, когда я запускаю код, Я получаю ошибку canNotProcessData. Программа успешно получает данные, но не может их обработать. Как мне go исправить это?

1 Ответ

1 голос
/ 01 марта 2020

Вы можете использовать QuickType для преобразования ваших данных в стандартную модель swift. ключи вашей структуры отличаются от вашего ответа.

это должно быть примерно так:

// MARK: - DataClass
struct DataClass: Codable {
    let globalQuote: GlobalQuote

    enum CodingKeys: String, CodingKey {
        case globalQuote = "Global Quote"
    }
}

// MARK: - GlobalQuote
struct GlobalQuote: Codable {
    let the01Symbol, the02Open, the03High, the04Low: String
    let the05Price, the06Volume, the07LatestTradingDay, the08PreviousClose: String
    let the09Change, the10ChangePercent: String

    enum CodingKeys: String, CodingKey {
        case the01Symbol = "01. symbol"
        case the02Open = "02. open"
        case the03High = "03. high"
        case the04Low = "04. low"
        case the05Price = "05. price"
        case the06Volume = "06. volume"
        case the07LatestTradingDay = "07. latest trading day"
        case the08PreviousClose = "08. previous close"
        case the09Change = "09. change"
        case the10ChangePercent = "10. change percent"
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...