检查可选 UserDefaults.standard.value

checking for an optional UserDefaults.standard.value

我检查我是否有用户的 Facebook 数据 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: Any]”的非可选表达式用于检查可选值

如果 UserDefaults.standard.value(forKey: "facebookDetails") 未设置,应用程序会崩溃。

这个条件 if 的正确写法是什么?

谢谢

您完全在滥用可选值、强制解包和 if let

您还应避免使用 value(forKey:)。并避免不必要的类型声明。让 Swift 在适当的时候推断类型。

您的 if 应该是:

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

您还应该避免强制展开,除非您确定该值(或转换)将始终成功。

并在您的代码中保持一致。你在一行中做:

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

还有一个你做的:

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

为什么要采用两种不同的方法来强制大小写和可选?