Я вижу два способа сделать это, первый требует изменения структуры Root, где нам нужно использовать часть метаданных сообщения
struct Root: Codable {
let metaData: [String: String]
let timeSeriesFX5Min: [String:Forex]
enum CodingKeys: String, CodingKey {
case timeSeriesFX5Min = "Time Series FX (5min)"
case metaData = "Meta Data"
}
}
Затем мы выбираем элемент с надписью «Последнее обновление» и используем это значение для поиска последней записи цены в словаре временных рядов.
do {
let forex = try JSONDecoder().decode(Root.self, from: data)
print(forex.metaData)
if let latestTime = forex.metaData["4. Last Refreshed"], let latestForex = forex.timeSeriesFX5Min[latestTime] {
print(latestForex)
}
} catch {
print(error)
}
Другой вариант - воспользоваться тем фактом, что временные метки даны в таком формате, что их можно правильно отсортировать, поэтому вместо использования метаданных мы сортируем ключи и выбираем последний элемент
if let latestTime = forex.timeSeriesFX5Min.keys.sorted().last, let latestForex = forex.timeSeriesFX5Min[latestTime] {
print(latestForex)
}