2017-09-16 1 views
1

-je vérifier si j'ai les données de l'utilisateur Facebook comme UserDefaults.standard.valuevérification pour une option 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 
      } 
     } 

Je reçois l'alerte suivante: expression non-option de type « [chaîne: Any] 'utilisé dans une vérification pour les options

et l'application se bloque si UserDefaults.standard.value (forKey: "facebookDetails") n'est pas défini.

Quelle est la bonne façon d'écrire ce conditionnel?

Merci

+0

N'utilisez pas 'value (forKey:)' pour obtenir un objet 'UserDefaults'. Utilisez la méthode 'object (forKey:)' ou l'une des nombreuses méthodes spécifiques au type telles que dictionary (forKey:) 'ou' string (forKey:) ', etc. – rmaddy

+0

et supprimez ce point d'exclamation à la fin de l'expression –

Répondre

4

Vous êtes complètement utilisent à mauvais escient optionals, forcé Dépaquetage et if let.

Vous devez également éviter d'utiliser value(forKey:). Et évitez les déclarations de type inutiles. Laissez Swift déduire le type le cas échéant.

Votre if devrait être:

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

Vous devriez aussi éviter la force déballant à moins que vous êtes sûr que la valeur (ou cast) toujours réussir.

Et soyez cohérent dans votre code. Sur une ligne vous:

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

et un autre que vous faites:

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

Pourquoi deux approches différentes pour forcer le cas et l'option?