处理布尔值的最佳方法是什么?

时间:2019-09-20 16:24:51

标签: swift

我的应用程序可用德语提供,大约有30个Xcode生成的Localizable.strings文件(意味着该应用程序还可以使用30种语言提供),我正在慢慢转换为迅速的structs,个人观点。

struct German {
    let contacting_app_services: String = "Kontaktiere App Service.."
    let validating_user: String = "Validiere Nutzer"
    let email_in_use: String = "Diese e-mail wird bereits von einem andern Konto genutzt"
    let account_not_found: String = "Nutzerkonto nicht gefunden. Bitte prüfen und nochmals versuchen"
    let valid_email: String = "Bitte geben Sie eine gültige e-mail Adresse ein"
}

现在,我检查设备是否为德语:

extension Locale {
    func isGerman() -> Bool {
        return Locale.preferredLanguages[0].range(of:"de") != nil
    }
}

并使用以下内容更新我的用户界面:

if Locale.current.isGerman() {
    self.errorLabel.text = German().valid_email
}

我要做什么:

  • 摆脱if statement,使用更简洁的方式。

2 个答案:

答案 0 :(得分:2)

不要这样做。即使您已经对系统中已内置的本地化工具产生了莫名其妙的排斥,也不要这样做。

试想一下,如果您必须支持多种语言,您会遇到什么麻烦。想象一下您想增加对联合国6种正式语言的支持。

if Locale.current.isArabic {
    self.errorLabel.text = Arabic().valid_email
}
else if Locale.current.isChinese {
    self.errorLabel.text =  Chinese().valid_email
}
else if Locale.current.isEnglish {
    self.errorLabel.text =  English().valid_email
}
else if Locale.current.isFrench {
    self.errorLabel.text = French().valid_email
}
else if Locale.current.isGerman {
    self.errorLabel.text = German().valid_email
}
else if Locale.current.isRussian {
    self.errorLabel.text = Russian().valid_email
}
else if Locale.current.isSpanish {
    self.errorLabel.text = Spanish().valid_email
} else {
    // What would you even put here?
}

真是一场灾难。有这么多问题:

  1. 您最终将在每个需要本地化字符串的地方重复使用if / else if / else梯形图
  2. 您在else案子中放什么?默认语言?
  3. 如果您在else情况下改变主意怎么办?您要回头在每个地方进行更改吗?
  4. 如果要添加新语言怎么办?您要回去添加到任何地方吗?如果您忘记了呼叫站点该怎么办?
  5. 想要支持30种语言时,外观如何?

那显然是一个完全的初学者。

相反,使用多态为您选择合适的字符串:


protocol LocalizedStrings {
    var contactingAppServices: String { get }
    var validatingUser: String { get }
    var emailInUse: String { get }
    var accountNotFound: String { get }
    var validEmail: String { get }
}

struct EnglishLocalizedStrings: LocalizedStrings {
    let contactingAppServices = "Contacting App Services, please wait."
    let validatingUser = "Validating user, please wait."
    let emailInUse = "This e-mail is already in use."
    let accountNotFound = "Account not found."
    let invalidEmail = "This e-mail is not valid"
}

struct ArabicLocalizedStrings: LocalizedStrings {
    // ...
}

// Somewhere in the initalization of your app 
let localizedStrings: LocalizedString = PickTheRightLocalizationStringsObjectForTheUser() 

// somewhere where you need localized strings: 
self.errorLabel.text = localizedStrings.validEmail

然后,您可以仅依靠动态调度机制为您进行分支,以为工作选择合适的字符串,而不必每次手动手动枚举每种可能的情况。

答案 1 :(得分:0)

我会选择:

protocol Translations {
    var valid_email: String { get }
}

struct German: Translations {
    var valid_email: String = "Bitte geben Sie eine gültige e-mail Adresse ein"
}

struct English: Translations {
    var valid_email: String = ""
}

extension Locale {
    static func isGerman() -> Bool {
        return Locale.preferredLanguages[0].range(of:"de") != nil
    }

    static func language() -> Translations {
        if isGerman() {
            return German()
        }
        return English()
    }
}

用法:

let errorLabel = UILabel()
errorLabel.text = Locale.language().valid_email