如何在ViewDidLoad中从NSUserDefaults中得到一个无值的值

我有一个情况,当我viewControler启动viewDidLoad我不得不加载一些数据使用NSUserDefaults.standardUserDefaults()这不存在于这个分量。 当我点击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不提供默认值,因为它不知道它是什么types的对象,直到你第一次设置。 如果您尝试访问它的值,而没有设置一次,这将导致零崩溃。

比较这个expression式来说“boolForKey”,你不必这样做,因为它知道你正在处理布尔值,所以默认为false。

你也不必创build2 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)中的默认值,在你的情况下是一个空字典。 这样你不必做一个零检查,全部在这一行中完成。

也可以尝试把你的密钥放入结构或全局文件中,这样可以避免input错误。 我看到人们不是一直在这样做,而且是非常糟糕的做法。 所以举个例子,在你的类的上面创build一个结构体

 struct Key { static let orderHistory = "OrderHistory" } 

并像这样使用它

  ...objectForKey(Key.orderHistory) 

这段代码没有意义:

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

if语句保证orderHistory为零,从而保证从orderHistory获取键的尝试将会崩溃。 其实,这看起来不像是有效的Swift。 我希望这一行抛出一个编译器错误。

你想创build一个新的字典吗?

如果是这样,你的代码应该像这样读取:

 if orderHistory == nil { self.orderHistory = ["name":"", "surname":""] }