2016-10-03 122 views
0

我不確定如何在新的Swift3更改中使用新的UserDefaults類。Swift 3遷移已清除NSUserDefault數據

我不得不之前遷移到swift3其成功地檢索存儲在userDefaults數據的代碼:

if NSUserDefaults.standardUserDefaults().objectForKey("profileArray") != nil {  
    profileArray = NSUserDefaults.standardUserDefaults().objectForKey("profileArray") as! [String] 
} 

隨着遷移至swift3代碼現在是:

if UserDefaults.standard.object(forKey: "profileArray") != nil {   
    profileArray = UserDefaults.standard.object(forKey: "profileArray")! as! [NSString] 
} 

新語法是有道理的,但是當我運行項目時,之前存儲在用戶默認中的數據似乎已經消失。
userdefault.standard現在返回空/零。

如何檢索在swift3遷移之前存儲的數據?

感謝swift3的幫助!

+1

是否有可能您的應用程序的命名空間改變了?根據您的設置,它可能會更改其中的一些設置,或者默認值可能已更改。 – PeejWeej

+5

很可能這不是Swift 3的問題。 – tktsubota

+0

@PEEJWEEJ我沒有明確地改變任何事情。在轉換過程中,這可能會改變嗎? –

回答

0

我終於明白了這一點。 userDefaults未被「清除」。但userDefaults是特定於設備的。所以隨着向xcode8的遷移,iOS模擬器也進行了升級....這些都是從未捕獲過userDefaults的技術新設備。

我通過添加一個模擬器證明了這個理論(你可以回去重新安裝iOS 9.x模擬器),並且這個工作。

我還使用iOS 9.x &在真實設備上測試了新的swift 3代碼,並且默認值在該設備上保留。

所以問題解決了! :)

0

我不知道這是否能解決您的問題,但是您的語法效率不高 - 您不必要地從用戶默認值中檢索對象兩次。

推薦的方法是可選的約束力和專用的方法來獲取一個數組:

if let array = UserDefaults.standard.array(forKey: "profileArray") as? [String] { 
    profileArray = array 
} 

林斯威夫特總是使用String而不是NSString,除非你別無選擇。

+0

謝謝。我同意效率,但事實仍然是,遷移前的代碼成功地處理並檢索了數據,並且在遷移到swift3之後,存儲在userDefaults中的數據似乎丟失了。 –

+0

我發現這[鏈接](http://stackoverflow.com/questions/37798426/using-nsuserdefaults-with-xcode-8-and-ios-10),這似乎接近我的問題。在其中一條評論中,用戶表示,在遷移到swift3之後,默認數據會持續存在......但我的示例似乎表明數據在遷移後不會持續存在。有數百名用戶使用我的應用程序,我需要找出存儲在我的應用程序的swift2.2版本下的NSUserDefault數據。 –