我正在 swift 中構建一個應用程式,它顯示幾個圖表,其中一個是匯率圖表,可以通過 UITableView 中的貨幣代碼和日期范圍進行過濾。我能夠成功地從https://fixer.io/提取 FX 資料并將該 json 資料轉換為以下 swift 結構:
struct FetchedFXRateByDate: Codable {
let success, timeseries: Bool
let startDate, endDate, base: String
let rates: [String: [String: Double]] // [Date: [Currency Code : Amount]]
enum CodingKeys: String, CodingKey {
case success, timeseries
case startDate = "start_date"
case endDate = "end_date"
case base, rates
}
}
我現在想要的是操縱或'映射'/'過濾'內部字典'讓率:[字串:[字串:雙]]',以轉換字典:
從:
[字串:[字串:雙精度]] // [日期:[貨幣代碼:金額]]
到:
[String: [String: Double]] // [貨幣代碼: [Date : Amount]]
有效地交換密鑰。這可以通過帶有鍵的 for 回圈輕松完成,但我需要一種更有效的方法來完成任務。這樣我就可以在下面的界面中繪制圖形:
圖表視圖
任何幫助是極大的贊賞!
uj5u.com熱心網友回復:
一種可能的方法是使用reduce(into:_:):
帶樣品:
let rates: [String: [String: Double]] = ["2021-11-14": ["CAD": 1.1,
"USD": 1.0,
"EUR": 0.9],
"2021-11-15": ["CAD": 1.11,
"USD": 1.01,
"EUR": 0.91]]
這應該可以解決問題:
let target = rates.reduce(into: [String: [String: Double]]()) { partialResult, current in
let date = current.key
let dayRates = current.value
dayRates.forEach { aDayRate in
var currencyRates = partialResult[aDayRate.key, default: [:]]
currencyRates[date] = aDayRate.value
partialResult[aDayRate.key] = currencyRates
}
}
對于邏輯,我們迭代 的每個元素rates。對于每個 [CurrencyCode: Amount],我們對它們進行迭代,并將它們設定為partialResult(在內回圈結束時reduce(into:_:)將是finalResult,即回傳值)。
print(rates)& 的輸出print(target)(我只是將它們格式化以使其更易于閱讀):
$> ["2021-11-14": ["CAD": 1.1, "EUR": 0.9, "USD": 1.0],
"2021-11-15": ["USD": 1.01, "EUR": 0.91, "CAD": 1.11]]
$> ["EUR": ["2021-11-14": 0.9, "2021-11-15": 0.91],
"USD": ["2021-11-15": 1.01, "2021-11-14": 1.0],
"CAD": ["2021-11-14": 1.1, "2021-11-15": 1.11]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358190.html
上一篇:使用不同的地圖同時映射多個列
