You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
    }
}

关键改动说明:

  1. List数据源修正:用results.rates.sorted(by: { $0.key < $1.key })来遍历排序后的字典,id: \.key用货币代码作为唯一标识,保证List的稳定性。
  2. 数据提取修正:直接使用遍历得到的item.key(货币代码,比如CAD)和item.value(汇率数值),不需要再从字典中二次取值。
  3. 汇率格式化:用String(format: "%.4f", item.value)把Double类型的汇率格式化为保留4位小数的字符串,显示更符合汇率的展示习惯。
  4. 完善loadData函数:补充了网络请求和JSON解析的逻辑,这样你的代码可以真正从API获取数据并展示。
  5. UI优化:把Text和List放在VStack里,添加了字体样式和间距,让界面更美观。

这样修改后,你的SwiftUI界面就能正确展示基础货币、日期,以及所有汇率的货币代码和对应数值啦!

内容的提问来源于stack exchange,提问作者Galen Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:31:58