我想用枚举处理本地化的字符串,所以我这样做,它工作正常,但这个解决方案的问题是:我不能轻易地从本地化的字符串中获取枚举值,我必须有密钥才能做到这一点:
let option = DietWithoutResidueOption(rawValue: "NoDiet")
如果不是,我必须调用dietWithoutResidueOptionWith方法来获取枚举值...:/
有更好的解决方案直接存储localizedString而不是枚举中的键吗?
谢谢
枚举
enum DietWithoutResidueOption: String {
case NoDiet = "NoDiet"
case ThreeDays = "ThreeDays"
case FiveDays = "FiveDays"
private func localizedString() -> String {
return NSLocalizedString(self.rawValue, comment: "")
}
static func dietWithoutResidueOptionWith(#localizedString: String) -> DietWithoutResidueOption {
switch localizedString {
case DietWithoutResidueOption.ThreeDays.localizedString():
return DietWithoutResidueOption.ThreeDays
case DietWithoutResidueOption.FiveDays.localizedString():
return DietWithoutResidueOption.FiveDays
default:
return DietWithoutResidueOption.NoDiet
}
}
}
可本地化的. string
"NoDiet" = "NON, JE N'AI PAS DE RÉGIME";
"ThreeDays" = "OUI, SUR 3 JOURS";
"FiveDays" = "OUI, SUR 5 JOURS";
打电话
println(DietWithoutResidueOption.FiveDays.localizedString())
7条答案
按热度按时间1tuwyuhd1#
试试这个,它非常简单直接:
您可以这样使用它:
希望这对你有用
p5fdfcr12#
您可以将任何
StringLiteralConvertible, Equatable
类型用于enum
的RawValue
类型。那么,怎么样:
使用此方法,可以通过3种方式构造
DietWithoutResidueOption
:并使用以下命令提取本地化字符串:
r7s23pms3#
这是一个迟来的答案,但我刚刚与苹果工程师就他们推荐的主题进行了交谈:
在您的情况下,解决方案与原始代码没有太大区别:
原因是他们不想让你把变量传递给NSLocalizedString()。这与优化和解析字符串有关。想象一下,Xcode在某个时候自己生成了可本地化的.strings文件,但它找不到字符串,因为它们是作为变量传递的。
piv4azn74#
一个不错的方法是使用静态变量创建一个可本地化字符串的结构,如下所示:
本地化字符串.swift
可本地化的. string
您的枚举将如下所示:
枚举
因此,例如,要获得你的描述,你可以这样做:
这种方法的好处是将可本地化字符串的键放在一个文件中。因此,例如,如果更改Localizable.strings文件中的 NoDiet 键,只需更新LocalizableStrings.swift文件,而不是将 NoDiet 键作为字符串的所有位置。此外,你要冒着在某个文件中拼写错误 NoDiet 键的风险,而你的代码在编译时不会出错,同时使用LocalizableStrings.swift中的一个静态变量,你可以避免这种情况,因为您的代码将无法编译,并且您将看到一条错误消息,指出错误所在。
5jdjgkvh5#
另一种选择:
枚举
可本地化的. string
压缩枚举:
提取本地化字符串:
输入
如果找不到本地化字符串或键,此代码将生成异常
vlju58qv6#
这是我的例子
用途
此本地化枚举可以轻松地与字符串格式一起使用。
ryevplcw7#
试试我创建的这个协议,你可以导入,使用它如下.
https://github.com/Wei18/ZWExt/blob/master/ZWExt/Classes/Protocol/Localizable.swift