【问题标题】:Swift - Dictionary Fetching API [duplicate]Swift - 字典提取 API [重复]
【发布时间】:2020-05-29 15:38:16
【问题描述】:

我正在创建一个简单的 iOS 应用程序,我使用以下函数从 API(开源)获取数据:

    private func fetchCurrencies() {
    if let url = URL(string: "http://data.fixer.io/api/latest?access_key=a5b8f8bd7583e32252946741********"){
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url) { data, response, error in
            guard error == nil else{
                return
            }

            if let data = data {
                let decoder = JSONDecoder()
                do {
                    let decodedData = try decoder.decode(Rates.self, from: data)
                    let array = decodedData.rates
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                } catch {
                    print("error decoding")
                }

            }
        }
        task.resume()
    }
}

数据模型是:

 struct Rates: Codable {
    let rates: [String: Double]
 }

以下是我的 API 数据的一部分:

"success": true,
"timestamp": 1590762665,
"base": "EUR",
"date": "2020-05-29",
"rates": {
    "AED": 4.08666,
    "AFN": 85.22449,
    "ALL": 124.556499,
    "AMD": 538.156223,
    "ANG": 1.996181,
    "AOA": 645.803727,
    "ARS": 76.250753,
    "AUD": 1.672917,
    "AWG": 2.002692,
    "AZN": 1.896163,
    "BAM": 1.95413,
    "BBD": 2.245466,
    "BDT": 94.371782,
    // and so on .....

获取数据工作正常,我收到了汇率,但我不知道如何在我的表格视图中发布这些数据(例如:单元格文本货币和单元格详细信息文本作为汇率)而且我觉得我的模型是没有按应有的结构,所以正确的方法应该是获取费率数据并将它们发布到我的表格视图中,作为数据建模,获取它们和表格单元格数据插入。

以下是我将数组打印到控制台时出现的部分内容:

 ▿ 168 elements
  ▿ 0 : 2 elements
   - key : "HKD"
   - value : 8.615716
  ▿ 1 : 2 elements
   - key : "IMP"
   - value : 0.900216
 ▿ 2 : 2 elements
   - key : "ZWL"
   - value : 357.865214
 ▿ 3 : 2 elements
   - key : "LBP"
   - value : 1676.38247

我希望我说清楚了,

提前谢谢你,

【问题讨论】:

  • 我会使用带有 String 和 Double 的 Rate 结构(或者更适合货币使用 NSDecimalNumber)属性。然后创建一个 Rate 数组,您可以将其用作表的数据源。
  • 首先,我使用了您建议的相同方式,但它一直给我错误解码数据,如果您将代码建议发布到答案中,我将不胜感激,这样我就可以更清楚地了解您的方法: )
  • 将你的json发布到app.quicktype.io,它会给你匹配的数据模型。
  • 这就是我得到的 :) struct Empty: Codable { let rates: [String: Double] }
  • 没错! ,提交答案中的链接,以便能够勾选您的答案并给您+1,如果有兴趣,谢谢:)

标签: ios arrays swift dictionary


【解决方案1】:

使用此代码将所有字典合并为一个

let flattenedArray = array
.flatMap { $0 }
.reduce([String:String]()) { (var dict, tuple) in
    dict.updateValue(tuple.1, forKey: tuple.0)
    return dict
}

接下来,你可以像我在下面那样使用 flattenedArray

            var i: Int = 0
            //use i as a counter
            while i < 168 {

            self.arrayOfRates.append(Array(flattenedArray)[i].value)
            self.arrayOfCurrency.append(Array(flattenedArray)[i].key)
                i = i + 1

            }

然后使用 arrayOfRates 作为单元格详细信息和 arrayOfCurrency 作为单元格文本设置您的 tableView。

如果您在设置 tableView 时需要帮助,请观看此视频https://www.youtube.com/watch?v=cJUmrdfgbbA

【讨论】:

  • 谢谢,我的 rates 数组实际上包含具有汇率和货币的字典数组,我无法访问它们中的每一个,因为每个字典键值都基于货币 iso 不同,怎么能我将字典数组拆分为 2 个数组,正如您建议的那样,一个用于汇率,一个用于货币,而它没有静态键值?
  • 请检查我的问题修改,我的控制台上打印的内容作为字典的键和值:)
  • 避免将两个数组用于仅当它们在一起时才有意义的数据。排序/过滤 tableView 增加了困难。
  • 我查看了问题,请查看我编辑的答案
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多