在swift中使用本地化字符串的枚举

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)

希望这对你有用

  • 您不能忘记将字符串的本地化版本添加到"Localizable.strings",否则将没有翻译版本. (3认同)

Sn0*_*eze 7

这是一个迟到的答案,但我刚刚与 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 文件,但它找不到字符串,因为它们作为变量传递。