2015-01-29 10 views
11

में स्थानीयकृत स्ट्रिंग के साथ एनम, मैं स्थानीयकृत स्ट्रिंग के साथ गणना का उपयोग करना चाहता हूं, इसलिए मुझे यह पसंद है, यह काम करता है, लेकिन इस समाधान की समस्या है: मुझे स्थानीयकृत स्ट्रिंग से आसानी से एनम मान नहीं मिल सकता है, मुझे अवश्य ही enum मूल्य प्राप्त करने के ...स्विफ्ट

let option = DietWithoutResidueOption(rawValue: "NoDiet") 

यदि नहीं मैं dietWithoutResidueOptionWith विधि कॉल करने चाहिए: यह करने के लिए कुंजी है/

वहाँ सीधे enum में 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, EquatableRawValue प्रकार 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

Ohter विकल्प :

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

स्थानीय बनाने।तार

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

constract enum:

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

निकालें स्थानीय तार:

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