我有一种情况,当我的viewControler
从viewDidLoad
开始时,我必须使用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/