如何为结构体所有常量扩展实现直接获取本地化字符串?
解决直接调用Localization结构体常量获取本地化字符串的问题
当然可以实现!这里有两种实用方案帮你达成无需额外调用.local的需求:
方案1:直接将静态属性改为计算属性(最简便)
把Localization里的静态常量改成返回本地化字符串的计算属性,这样直接访问属性就得到最终的本地化文本:
struct Localization { // Home 模块本地化内容 static var HomeHeader: String { return "Home_Header".local } static var HomeStatusActive: String { return "Home_Status_Active".local } static var HomeStatusDelayed: String { return "Home_Status_Delayed".local } }
使用方式:
titleLabel.text = Localization.HomeHeader // 直接拿到本地化字符串
优缺点:
- ✅ 实现成本极低,代码改动最小
- ❌ 无法直接获取原始的本地化键(如果后续需要用到键本身的话,得额外存储)
方案2:自定义LocalizedKey类型(兼顾灵活性)
如果需要保留原始本地化键的访问能力,同时支持自动转换为本地化字符串,可以自定义一个类型并实现隐式转换:
// 自定义封装本地化键的类型 struct LocalizedKey: ExpressibleByStringLiteral { let rawKey: String // 内部获取本地化字符串 var localized: String { return rawKey.local } // 支持直接用字符串字面量初始化 init(stringLiteral value: StringLiteralType) { self.rawKey = value } // 实现到String的隐式转换,赋值时自动转为本地化文本 static func ~=(lhs: String.Type, rhs: LocalizedKey) -> String { return rhs.localized } } // 扩展String,支持从LocalizedKey初始化 extension String { init(_ key: LocalizedKey) { self = key.localized } } // 修改Localization结构体的属性类型为LocalizedKey struct Localization { static let HomeHeader: LocalizedKey = "Home_Header" static let HomeStatusActive: LocalizedKey = "Home_Status_Active" static let HomeStatusDelayed: LocalizedKey = "Home_Status_Delayed" }
使用方式:
// 直接赋值,自动转为本地化字符串 titleLabel.text = Localization.HomeHeader // 如需访问原始键,直接调用rawKey属性 let originalKey = Localization.HomeHeader.rawKey
优缺点:
- ✅ 既可以直接获取本地化字符串,又能随时拿到原始键
- ✅ 支持字符串字面量初始化,写法和原来的常量定义几乎一致
- ❌ 相比方案1多了一层类型封装,代码量稍多
两种方案都能完美适配你现有的String扩展.local,根据自己的需求选择即可。
内容的提问来源于stack exchange,提问作者Göktuğ Aral
相关产品推荐
相关产品推荐

