SwiftUI中展示外汇汇率字典键值对问题求助
解决SwiftUI中展示汇率字典键值对的问题
嘿,我来帮你搞定这个展示汇率条目的问题!你的RateResult结构体定义是对的,但ContentView里的List用法和数据提取有几个小问题,下面一步步给你修正:
先看原代码的问题点:
List(results, id: \.results.rates)这里不对,results是单个RateResult实例,不是可遍历的集合,我们需要遍历的是它里面的rates字典的键值对。- 遍历字典时,每个元素是
(key: String, value: Double)的元组,你不需要再用results.rates[item.key]去取值,直接用item.key和item.value就可以了。 Double类型不能直接传给Text,需要转换成字符串或者用字符串插值。
修正后的完整代码:
import SwiftUI struct RateResult: Codable { let rates: [String: Double] let base, date: String } struct ContentView: View { @State private var results = RateResult(rates: [:], base: "EUR", date: "") let baseCurrency = "EUR" // 把curr改成更清晰的命名 var body: some View { VStack(alignment: .leading, spacing: 16) { Text("Base Currency = \(results.base)") .font(.headline) Text("Date = \(results.date)") .font(.subheadline) // 遍历排序后的汇率字典,按货币代码字母排序 List(results.rates.sorted(by: { $0.key < $1.key }), id: \.key) { item in HStack { Text(item.key) .font(.title3) .fontWeight(.semibold) Spacer() // 格式化汇率,保留4位小数,显示更规范 Text(String(format: "%.4f", item.value)) .font(.title3) } } .listStyle(.plain) } .padding() .onAppear(perform: loadData) } func loadData() { guard let url = URL(string: "https://api.exchangerate.host/latest?base=\(baseCurrency)") else { print("Invalid URL") return } let request = URLRequest(url: url) URLSession.shared.dataTask(with: request) { data, response, error in if let data = data { do { let decodedResult = try JSONDecoder().decode(RateResult.self, from: data) DispatchQueue.main.async { self.results = decodedResult } } catch { print("Decoding error: \(error)") } } }.resume() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
关键改动说明:
- List数据源修正:用
results.rates.sorted(by: { $0.key < $1.key })来遍历排序后的字典,id: \.key用货币代码作为唯一标识,保证List的稳定性。 - 数据提取修正:直接使用遍历得到的
item.key(货币代码,比如CAD)和item.value(汇率数值),不需要再从字典中二次取值。 - 汇率格式化:用
String(format: "%.4f", item.value)把Double类型的汇率格式化为保留4位小数的字符串,显示更符合汇率的展示习惯。 - 完善loadData函数:补充了网络请求和JSON解析的逻辑,这样你的代码可以真正从API获取数据并展示。
- UI优化:把Text和List放在VStack里,添加了字体样式和间距,让界面更美观。
这样修改后,你的SwiftUI界面就能正确展示基础货币、日期,以及所有汇率的货币代码和对应数值啦!
内容的提问来源于stack exchange,提问作者Galen Smith
相关产品推荐
相关产品推荐

