swift - 将来自 API 的解码数据用于算法

标签 swift algorithm api

我成功地从 API 获取和解码了数据,现在可以访问我想在我的应用程序中编写的算法中需要使用的所有数据。

问题是我不知道如何在解码后访问这些数据,我可以在解码后立即打印它,但我不知道如何在我的应用程序中的其他功能或位置使用它。

这是我的 Playground :

import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

enum MyError : Error {
    case FoundNil(String)
}

struct Level: Codable {
    let time: Double
    let close: Double
    let high: Double
    let low: Double
    let open: Double
}

struct Response: Codable {
    let data: [Level]

    private enum CodingKeys : String, CodingKey {
        case data = "Data"
    }
}

func fetchData(completion: @escaping (Response?, Error?) -> Void) {
    let url = URL(string: "https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG")!

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data else { return }
        do {
            if let marketData = try? JSONDecoder().decode(Response.self, from: data) {
                print(marketData.data[0].open)
                print(marketData.data[1].open)
                print("Average=", (marketData.data[0].open + marketData.data[1].open) / 2)
                //completion(marketData, nil)
                throw MyError.FoundNil("data")
            }
        } catch {
            print(error)
        }
    }
    task.resume()
}

fetchData() { items, error in
    guard let items = items,
        error == nil else {
            print(error ?? "Unknown error")
            return
    }
    print(items)
}

我如何在其他地方使用 .data[0]、.data[1]、...?

最佳答案

您的数据将在您的 fecthData() 调用中可用。可能您想要的是您的 items 变量,您正在打印它。但请确保在您的 fetchData 实现中调用完成。

警告:未经测试的代码。

import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

enum MyError: Error {
    case FoundNil(String)
    case DecodingData(Data)
}

struct Level: Codable {
    let time: Double
    let close: Double
    let high: Double
    let low: Double
    let open: Double
}

struct Response: Codable {
    let data: [Level]

    private enum CodingKeys : String, CodingKey {
        case data = "Data"
    }
}

func fetchData(completion: @escaping (Response?, Error?) -> Void) {
    let url = URL(string: "https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG")!

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data else { 
            completion(nil, MyError.FoundNil("data"))
        }

        do {
            if let marketData = try? JSONDecoder().decode(Response.self, from: data) {
                completion(marketData, nil)
            } else {
                completion(nil, MyError.DecodingData(data)) // work on this duplicated call
            }
        } catch {
            completion(nil, MyError.DecodingData(data)) // work on this duplicated call
        }
    }

    task.resume()
}

fetchData() { items, error in
    if let error == error {
        switch(error) {
            case .foundNil(let whatsNil):
                print("Something is nil: \(whatsNil)")
            case .decodingData(let data):
                print("Error decoding: \(data)")
        }
    } else {
        if let items = items {
            print(items.data[0].open)
            print(items.data[1].open)
            print("Average=", (items.data[0].open + items.data[1].open) / 2)

            print(items)
        } else {
            print("No items to show!")
        }
    }
}

关于swift - 将来自 API 的解码数据用于算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48021624/

相关文章:

ios - 分享视频到 Facebook - Swift IOS

c++ - 使用 “any_of”时如何检查字符串是否没有特定符号?

ruby-on-rails - 如何确保 Rails API 不受 CSRF 的影响?

c++ - 查找某个字符串的字典顺序最小排列

javascript - Axios 不在请求中传递 header

api - 免费的 LSI 服务或 API 来获取相关关键字

ios - Swift 中的可选闭包属性

swift - 为什么 swift 同时提供 CGRect 初始化器和 CGRectMake 函数?

ios - X代码 6 : I can't select a view by its storyboard ID

algorithm - 搜索最近的 k 个元素