Ham*_*mza 14 enums localization ios swift
我想使用枚举与本地化的字符串,所以我喜欢这样,它的工作原理,但这个解决方案的问题是:我无法从本地化字符串轻松获取枚举值,我必须有关键来做到这一点:
let option = DietWithoutResidueOption(rawValue: "NoDiet")
Run Code Online (Sandbox Code Playgroud)
如果不是我必须调用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
}
}
}
Run Code Online (Sandbox Code Playgroud)
Localizable.strings
"NoDiet" = "NON, JE N'AI PAS DE RÉGIME";
"ThreeDays" = "OUI, SUR 3 JOURS";
"FiveDays" = "OUI, SUR 5 JOURS";
Run Code Online (Sandbox Code Playgroud)
呼叫
println(DietWithoutResidueOption.FiveDays.localizedString())
Run Code Online (Sandbox Code Playgroud)
rin*_*aro 12
您可以使用任何StringLiteralConvertible, Equatable类型的RawValue类型enum.
那么,怎么样:
import Foundation
struct LocalizedString: StringLiteralConvertible, Equatable {
let v: String
init(key: String) {
self.v = NSLocalizedString(key, comment: "")
}
init(localized: String) {
self.v = localized
}
init(stringLiteral value:String) {
self.init(key: value)
}
init(extendedGraphemeClusterLiteral value: String) {
self.init(key: value)
}
init(unicodeScalarLiteral value: String) {
self.init(key: value)
}
}
func ==(lhs:LocalizedString, rhs:LocalizedString) -> Bool {
return lhs.v == rhs.v
}
enum DietWithoutResidueOption: LocalizedString {
case NoDiet = "NoDiet"
case ThreeDays = "ThreeDays"
case FiveDays = "FiveDays"
var localizedString: String {
return self.rawValue.v
}
init?(localizedString: String) {
self.init(rawValue: LocalizedString(localized: localizedString))
}
}
Run Code Online (Sandbox Code Playgroud)
使用它,您可以DietWithoutResidueOption通过3种方式构建:
let option1 = DietWithoutResidueOption.ThreeDays
let option2 = DietWithoutResidueOption(rawValue: "ThreeDays") // as Optional
let option3 = DietWithoutResidueOption(localizedString: "OUI, SUR 3 JOURS") // as Optional
Run Code Online (Sandbox Code Playgroud)
并提取本地化的字符串:
let localized = option1.localizedString
Run Code Online (Sandbox Code Playgroud)
Sep*_*nic 11
试试这个,它非常简单直接:
enum ChoicesTitle: String {
case choice1 = "Choice 1"
case choice2 = "Choice 2"
case choice3 = "Choice 3"
case choice4 = "Choice 4"
case choice5 = "Choice 5"
case choice6 = "Choice 6"
func localizedString() -> String {
return NSLocalizedString(self.rawValue, comment: "")
}
static func getTitleFor(title:ChoicesTitle) -> String {
return title.localizedString()
}
}
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它:
let stringOfChoice1: String = ChoicesTitle.getTitleFor(title: .choice1)
Run Code Online (Sandbox Code Playgroud)
希望这对你有用
这是一个迟到的答案,但我刚刚与 Apple 工程师聊了聊他们建议这样做的主题:
enum LocalizedStrings {
case title
var localized: String {
switch self {
case .title:
return NSLocalizedString("My Title", comment: "My Comment")
}
}
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,解决方案与原始代码没有太大区别:
enum DietWithoutResidueOption {
case NoDiet
case ThreeDays
case FiveDays
var localizedString: String {
switch self {
case .NoDiet:
return NSLocalizedString("NoDiet", comment: "Some comment")
case .ThreeDays:
return NSLocalizedString("ThreeDays", comment: "Some comment")
case .FiveDays:
return NSLocalizedString("FiveDays", comment: "Some 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
原因是他们不希望您将变量传递给 NSLocalizedString()。这与优化和解析字符串有关。想象一下 Xcode 在某个时候自己生成 localizable.strings 文件,但它找不到字符串,因为它们作为变量传递。
| 归档时间: |
|
| 查看次数: |
8584 次 |
| 最近记录: |