2016-10-03 116 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数据。 –