如何不从 ViewDidLoad 中的 NSUserDefaults 获取 nil 值
how to don't get a nil value from NSUserDefaults in ViewDidLoad
我有一个案例,当我的 viewControler
在 viewDidLoad
开始时,我必须使用 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)
我有一个案例,当我的 viewControler
在 viewDidLoad
开始时,我必须使用 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)