2015-01-29 3 views
11

Я хочу использовать перечисление с локализованной строкой, поэтому я делаю это, это работает, но проблема этого решения: я не могу легко получить значение перечисления из локализованной строки, я должен есть ключ, чтобы сделать это:Enum с локализованной строкой в ​​swift

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 
    } 
    } 
} 

Localizable.strings

"NoDiet" = "NON, JE N'AI PAS DE RÉGIME"; 
"ThreeDays" = "OUI, SUR 3 JOURS"; 
"FiveDays" = "OUI, SUR 5 JOURS"; 

вызов

println(DietWithoutResidueOption.FiveDays.localizedString()) 

ответ

10

Вы можете использовать любой тип 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)) 
    } 
} 

Используя это, вы можете построить DietWithoutResidueOption 3 путями:

let option1 = DietWithoutResidueOption.ThreeDays 
let option2 = DietWithoutResidueOption(rawValue: "ThreeDays") // as Optional 
let option3 = DietWithoutResidueOption(localizedString: "OUI, SUR 3 JOURS") // as Optional 

и извлечь локализованную строку с:

let localized = option1.localizedString 
1

Отер альтернативы :

Enum

enum Title : String { 

    case CEO = "CEOKey" 
    case CTO = "CTOKey" 
    case CFO = "CFOKey" 

    private static let allTitles = [CEO, CTO, CFO] 

    var localizedString: String { 
    return NSLocalizedString(self.rawValue, comment: "") 
    } 

    init!(rawValue: String) { 
    var keys = Title.allTitles 
    var filtered = keys.filter { $0.rawValue == rawValue } 

    self = filtered.first! 
    } 

    init!(localizedString: String) { 
    var keys = Title.allTitles 
    var filtered = keys.filter { $0.localizedString == localizedString } 

    self = filtered.first! 
    } 
} 

Localizable.Строки

"CEOKey" = "Chief Executive Officer"; 
"CTOKey" = "Chief Technical Officer"; 
"CFOKey" = "Chief Financial Officer"; 

Constract перечисление:

let option1 = Title.CFO 
let option2 = Title(rawValue: "CTOKey") // init from key 
let option3 = Title(localizedString: NSLocalizedString("CEOKey", comment: "")) // init from value 

Extract локализованные строки:

println("option1 localized string : \(option1.localizedString)") 
println("option2 localized string : \(option2.localizedString)") 
println("option3 localized string : \(option3.localizedString)") 

Входной

option1 localized string : Chief Financial Officer 
option2 localized string : Chief Technical Officer 
option3 localized string : Chief Executive Officer 

Этот код будет генерировать исключение, если локализованные строки или ключи не найдены

4

Попробуйте, это довольно просто и прямо вперед:

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() 
    } 
} 

И вы могли бы использовать его как это:

let stringOfChoice1: String = ChoicesTitle.getTitleFor(title: .choice1) 

Надеюсь, это сработает для вас

+1

Вы не должны забывать добавлять локализованные версии строки в «Localizable.strings», иначе не было бы переведенной версии. – NerdyTherapist