[英]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不提供默認值,因為在您第一次設置它之前,它不知道它是哪種對象。 如果您嘗試不設置一次就訪問它的值,則會導致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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.