2017-09-16 24 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 

为什么采取两种不同的方法来强迫的情况下和可选?