我有一种情况,当我的viewControlerviewDidLoad开始时,我必须使用NSUserDefaults.standardUserDefaults()加载一些数据,而该数据在此monent中不存在。当我在同一send Button中点击viewController时,将保存这些数据,而当我再次打开此viewController时,则需要此数据。现在看起来像这样:

var orderHistory = [String:String]()

vievDidLoad(){

let userDefault = NSUserDefaults.standardUserDefaults()
let orderHistory = userDefault.objectForKey("orderHistory")

if orderHistory == nil {
self.orderHistory = orderHistory["name":"", "surname":""] as! [String:String]
} else {
self.orderHistory = orderHistory as! [String:String]
{

}// end viewDidLoad


在这一刻,我收到一个信息,我的记忆有问题。我应该如何避免这种情况?

最佳答案

正如Leo Dabus所说,您应该尝试使用??。无合并运算符。
ObjectForKey不提供默认值,因为在您第一次设置它之前,它不知道它是哪种对象。如果您尝试不设置一次就访问它的值,则会导致nil崩溃。

比较一下,在不需要执行此操作的地方说“ boolForKey”,因为它知道您正在处理布尔值,因此默认自动为false。

您也不必创建2个orderHistory字典,这只会使您的代码更加混乱。

试试这个

var orderHistory = [String:String]()

 vievDidLoad(){

 let userDefault = NSUserDefaults.standardUserDefaults()
 orderHistory = userDefault.objectForKey("orderHistory") as? [String: String] ?? orderHistory


   //than just use the 1 dictionary without the if statements or creating another one.


  }// end viewDidLoad


您检查是否存在已保存的数据(如[String:String])并相应地更新字典。如果不存在保存的数据,它将使用orderHistory(?? orderHistory)的默认值,在您的情况下为默认字典。
这样,您不必做nil检查,所有检查都在那一行中完成。

另外,请尝试将密钥放入结构或全局文件中,以避免输入错误。我看到人们一直没有这样做,这是非常糟糕的做法。
因此,例如,在您的课程上方创建一个结构

struct Key {
     static let orderHistory = "OrderHistory"
}


像这样使用

 ...objectForKey(Key.orderHistory)

关于ios - 如何从ViewDidLoad中的NSUserDefaults中获取零值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35880173/

10-09 16:55