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

SwiftUI解码Base64 JSON国旗数据失败 Picker无法显示国旗求助

问题根因
  • 条件判断语法错误:你写的if case country.flag = Data(base64Encoded: flag)属于错误的模式匹配写法,完全没有实现base64数据校验的逻辑
  • 数据源传错:你定义的常量let flag = "flag"是固定字符串"flag",根本不是Country模型里存储的国旗base64字符串,用这个值做解码必然失败
  • Picker标签绑定混乱:你分别给Text和Image绑定了不同类型的tag,会导致选中值匹配异常
可直接运行的修复代码

首先删除无用属性let flag = "flag",然后替换视图层的Picker实现:

VStack {
    Picker(selection: $selectedCountry,
           label: Text("Host Country:")) {
        ForEach(countryImage) { country in
            HStack {
                Text(country.name)
                // 直接从当前遍历的country模型取flag字段做base64解码
                if let flagData = Data(base64Encoded: country.flag),
                   let flagUIImage = UIImage(data: flagData) {
                    Image(uiImage: flagUIImage)
                        .resizable()
                        .scaledToFit()
                        .frame(width: 20, height: 15)
                }
            }
            // tag统一绑定在HStack根节点,和$selectedCountry的类型完全匹配
            .tag(country.name)
        }
    }
    .padding(.horizontal, 0)
    .padding()
    .pickerStyle(MenuPickerStyle())
}

你提供的JSON样例里的base64是合法的(已验证可以正常解码出苏丹国旗),改完后不会再打印Fail,国旗可以正常显示。

逻辑解耦复用方案

如果要把图片转换逻辑和View代码解耦,可以给String加扩展封装base64转图片的能力:

extension String {
    func convertBase64ToUIImage() -> UIImage? {
        guard let data = Data(base64Encoded: self) else { return nil }
        return UIImage(data: data)
    }
}

之后视图层代码可以大幅简化,不需要把解码逻辑堆在View里:

HStack {
    Text(country.name)
    if let flagImage = country.flag.convertBase64ToUIImage() {
        Image(uiImage: flagImage)
            .resizable()
            .scaledToFit()
            .frame(width: 20, height: 15)
    }
}
.tag(country.name)

你现有的Bundle解码扩展逻辑没有问题,不需要修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:57:15