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

如何让String Catalog与Swift枚举的原始值配合使用?

解决SwiftUI枚举本地化(String Catalog)+ 保持Identifiable的问题

完全可以用String Catalog来本地化这些枚举字符串,只需调整枚举实现,把逻辑判断和显示文本分离,同时满足Identifiable协议。下面是两种可行方案:

方案1:用rawValue作为本地化键(兼容原有逻辑)

保留枚举的String rawValue,但将原来的显示文本替换为String Catalog的本地化键,再添加计算属性返回本地化后的字符串:

enum DayRange: String, CaseIterable, Identifiable {
    // rawValue改为本地化键,对应String Catalog中的条目
    case fourteen = "fourteen_days"
    case ninety = "ninety_days"
    case allTime = "all_time"
    
    // 获取本地化后的显示文本
    var localized: String {
        String(localized: .init(rawValue))
    }
    
    // 用枚举自身作为id(比依赖rawValue更可靠,避免键修改影响id)
    var id: DayRange { self }
}

操作步骤:

  1. 在String Catalog中添加三个键:fourteen_days、ninety_days、all_time,分别填入各语言的翻译(比如英文填"14 Days",中文填"14天")。
  2. Picker中使用range.localized作为显示文本:
Picker("Date Range", selection: $selectedRange) {
    ForEach(DayRange.allCases) { range in
        Text(range.localized)
            .tag(range)
    }
}
.pickerStyle(.segmented)
  1. 原有日期范围判断逻辑不受影响,依然可以用switch dayRange { case .fourteen: ... }处理。

方案2:剥离rawValue,单独定义本地化键(更清晰的逻辑分离)

如果不需要用rawValue做逻辑判断,直接把枚举改成无rawValue的形式,单独定义本地化键:

enum DayRange: CaseIterable, Identifiable {
    case fourteen, ninety, allTime
    
    // 定义每个case对应的本地化键
    private var localizationKey: String {
        switch self {
        case .fourteen: return "fourteen_days"
        case .ninety: return "ninety_days"
        case .allTime: return "all_time"
        }
    }
    
    // 获取本地化文本
    var localized: String {
        String(localized: .init(localizationKey))
    }
    
    var id: DayRange { self }
}

为什么之前的尝试失败?

你把枚举类型改成LocalizedStringKey后无法符合Identifiable,是因为LocalizedStringKey没有默认的id实现,而且这种做法会把逻辑判断和显示文本绑定在一起,不符合代码设计原则。上面的方案把逻辑(枚举case)和显示(本地化文本)完全分离,既满足本地化需求,又保证了协议合规。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:35:01