bugfix> swift > 投稿

appDelegate didFinishLaunchingWithOptions UserDefaults に値を保存します次のように:

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

そして、私は1つの extension を持っています String の以前に UserDefaults に保存した値にアクセスする場所しかしそこに私は nil を得ました 。コードをデバッグしようとしたとき、拡張機能が func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool の前に実行されていたことを知りました

誰がこれが起こったのか説明できますか?

事前に感謝

私のコードは次のとおりです。

appDelegateの場合:

 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 件
  • あなたの 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: "")
              }
        }
    }
    
    

あなたの答え