如何让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 } }
操作步骤:
- 在String Catalog中添加三个键:
fourteen_days、ninety_days、all_time,分别填入各语言的翻译(比如英文填"14 Days",中文填"14天")。 - Picker中使用
range.localized作为显示文本:
Picker("Date Range", selection: $selectedRange) { ForEach(DayRange.allCases) { range in Text(range.localized) .tag(range) } } .pickerStyle(.segmented)
- 原有日期范围判断逻辑不受影响,依然可以用
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
相关产品推荐
相关产品推荐

