如何不从 ViewDidLoad 中的 NSUserDefaults 获取 nil 值

how to don't get a nil value from NSUserDefaults in ViewDidLoad

我有一个案例,当我的 viewControlerviewDidLoad 开始时,我必须使用 NSUserDefaults.standardUserDefaults() 加载一些数据,这在这个时刻不存在。当我在同一个 viewController 中点击 send Button 时会保存此数据,当我再次打开此 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

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

这段代码没有意义:

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

if 语句保证 orderHistory 为 nil,从而保证从 orderHistory 获取键的尝试会崩溃。实际上,这看起来不像是有效的 Swift。我希望该行会引发编译器错误。

您要创建新词典吗?

如果是这样,您的代码应如下所示:

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

正如 Leo Dabus 所说,您应该尝试使用 ??零合并运算符。 ObjectForKey 不提供默认值,因为它不知道它是什么类型的对象,直到您第一次设置它。如果您尝试在未设置一次的情况下访问它的值,这将导致零崩溃。

将此与说 "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) 中的默认值,在您的情况下,它是一个空字典。 这样你就不必做一个零检查,它全部在一行中完成。

还请尝试将您的密钥放入结构或全局文件中,以免出现拼写错误。我看到人们并不总是这样做,这是非常糟糕的做法。 因此,例如,在您的 class 之上创建一个结构

struct Key {
     static let orderHistory = "OrderHistory"
}

并像这样使用它

 ...objectForKey(Key.orderHistory)