如何在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":""] }