мое расширение строки запускается до appDelegate, почему это происходит? - PullRequest
0 голосов
/ 25 мая 2018

In appDelegate didFinishLaunchingWithOptions Я сохраняю значение в UserDefaults следующим образом:

  UserDefaults.standard.setValue("fr", forKey: "selectedLocale")

, и у меня есть один extension из String, где я получаю доступ к значению, которое ранее сохранялось в UserDefaults, нотам я получил nil.Когда я попытался отладить код, я узнал, что расширение работало до того, как func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

может кто-нибудь объяснить, почему это произошло?

Заранее спасибо

Мой код выглядит следующим образом:

Для приложенияДелегат:

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
   /*----------------- Setting Locale on App Launch ------------------*/
    // UserDefaults.standard.setValue((UserDefaults.standard.value(forKey: "AppleLanguages") as! [Any])[0], forKey: USER_DEFAULT.selectedLocale)
    let country = NSLocale.current
    if let locale = country.collatorIdentifier {
        if locale.contains("en") {
            Singleton.sharedInstance.currentLocale = "en"
        } else {
            Singleton.sharedInstance.currentLocale = "fr"
        }
    } else {
        Singleton.sharedInstance.currentLocale = "fr"
    }
    Singleton.sharedInstance.isRTL = false
    UserDefaults.standard.setValue(Singleton.sharedInstance.currentLocale, forKey: USER_DEFAULT.selectedLocale)
  }

И Для расширения:

  extension String {
        var localized: String {
              let locale = UserDefaults.standard.value(forKey: USER_DEFAULT.selectedLocale) as? String
              if let path = Bundle.main.path(forResource: locale, ofType: "lproj") {
                    let bundle = Bundle(path: path)
                    return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
              }
        return self
        }
  }

1 Ответ

0 голосов
/ 25 мая 2018

ваш extension String будет вызывать при инициализации любой из строк.в вашем коде currentLocale. Для моего Мнения вам нужно создать функцию в extension и вызывать ее при сохранении значения.

UserDefaults.standard.setValue(Singleton.sharedInstance.currentLocale, forKey: USER_DEFAULT.selectedLocale) 
Singleton.sharedInstance.currentLocale.loadNib() //function in extension

пример

extension String {
     func loadNib() {
         let locale = UserDefaults.standard.value(forKey: USER_DEFAULT.selectedLocale) as? String
         if let path = Bundle.main.path(forResource: locale, ofType: "lproj") {
            let bundle = Bundle(path: path)
            return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
          }
    }
}
...