【问题标题】:Swift NSLocale programming constantsSwift NSLocale 编程常量
【发布时间】:2017-12-17 16:44:34
【问题描述】:
有没有更好的编码方式而不使用魔法“en”、“es”字符串?
let pre = Locale.preferredLanguages[0]
if pre == "en"
....
else if pre == "es"
....
else if pre == "xx"
....
我正在考虑得到编译时错误,而不是犯错误这样会更好
let pre = Locale.preferredLanguages[0]
if pre == NSLocale.something.ENGLISH
....
else if pre == NSLocale.something.SPANISH
....
else if pre == //and so on
....
但我找不到任何东西。
这是正确的编码方式吗?
【问题讨论】:
标签:
ios
swift
internationalization
【解决方案1】:
对于您计划在您的应用中支持的语言,创建一个将preferredLanguages 映射到枚举案例的枚举。下面的片段添加了英语和西班牙语的案例。
// Create an enum that maps known language "Strings" to a case statement.
public enum LanguageMap : String{
// Add a case for all the languages you app will support
case English = "en"
case Spanish = "es"
}
扩展 Locale 以添加将返回 [LanguageMap] 对象而不是 [String] 的属性。
// Extend the Locale class to return
extension Locale{
public static var preferredLanguageMap : [LanguageMap] {
let langMap = Locale.preferredLanguages.flatMap({return LanguageMap.init(rawValue: $0) })
return langMap
}
}
在您的应用程序中,将 if-else 语句替换为 switch case 语句。
// Your application Logic.
switch Locale.preferredLanguageMap.first! {
case .English :
print("Do Something the English Way")
case .Spanish :
print("Do Something the Spanish Way")
default:
print("Do Anything... Throw an error/Default Handling.")
// Note : Locale.availableIdentifiers has 789 language identifiers till date.
// This could also change in the future.
// Ensure you have some default logic for all 'other languages' here.
}