2017-09-16 55 views
1

我檢查我是否有用戶的Facebook數據UserDefaults.standard.value檢查可選UserDefaults.standard.value

if let facebookDetails:Dictionary = (UserDefaults.standard.value(forKey: "facebookDetails") as? [String:Any])! { 
     dump(facebookDetails) 

     let picture:Dictionary = (facebookDetails["picture"] as? [String:Any])! 
     let fb_pic_data:Dictionary = (picture["data"] as? [String:Any])! 
     let fb_pic_data_url:String = fb_pic_data["url"] as! String 
      if let checkedUrl = URL(string: fb_pic_data_url) { 
       profiler.contentMode = .scaleAspectFit 
       downloadImage(url: checkedUrl) 
       profiler.layer.borderWidth = 1 
       profiler.layer.masksToBounds = false 
       profiler.layer.borderColor = UIColor.black.cgColor 
       profiler.layer.cornerRadius = profiler.frame.height/2 
       profiler.clipsToBounds = true 
      } 
     } 

我得到以下警告:String類型的「[ 非可選表達式:任何]'用於支付可選項

和應用程序崩潰,如果UserDefaults.standard.value(forKey:「facebookDetails」)未設置。

寫這個條件的正確方法是什麼?

感謝

+0

不要使用'value(forKey:)'從'UserDefaults'中獲取對象。使用'object(forKey:)'方法或多種類型特定的方法之一,例如'dictionary(forKey :)'或'string(forKey :))等。 – rmaddy

+0

並在表達式末尾放置感嘆號 –

回答

4

你完全濫用自選,強制解包和if let

你也應該避免使用value(forKey:)。並避免不必要的類型聲明。讓Swift在適當的時候推斷這種類型。

if應該是:

if let facebookDetails = UserDefaults.standard.dictionary(forKey: "facebookDetails") { 
} 

你也應該避免力展開,除非你肯定知道的值(或CAST)將總是成功。

並在您的代碼中保持一致。在一行中你做:

let picture:Dictionary = (facebookDetails["picture"] as? [String:Any])! 

和另一個你做:

let fb_pic_data_url:String = fb_pic_data["url"] as! String 

爲什麼採取兩種不同的方法來強迫的情況下和可選?