簡體   English   中英

如何從ViewDidLoad中的NSUserDefaults中獲取零值

[英]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不提供默認值,因為在您第一次設置它之前,它不知道它是哪種對象。 如果您嘗試不設置一次就訪問它的值,則會導致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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM