2017-09-16 2 views
1

ich überprüfen, ob ich Benutzers Facebook-Daten als UserDefaults.standard.value habenÜberprüfung für eine optionale 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 
      } 
     } 

erhalte ich die folgende Warnung: Nicht optional Ausdruck vom Typ ‚[String: Any] 'in einer Prüfung für Optionals verwendet

und App stürzt ab, wenn UserDefaults.standard.value (forKey: "facebookDetails") ist nicht festgelegt.

Was ist die richtige Art, diese Bedingung zu schreiben, wenn?

Dank

+0

Verwenden Sie nicht 'value (forKey:)', um ein Objekt von 'UserDefaults' zu erhalten. Verwenden Sie die Methode 'object (forKey:)' oder eine der vielen typspezifischen Methoden wie 'dictionary (forKey:)' oder 'string (forKey:)' usw. – rmaddy

+0

und löschen Sie das Ausrufezeichen am Ende des Ausdrucks –

Antwort

4

Sie sind optionals, Zwang Abwickeln und if let vollständig zu mißbrauchen.

Sie sollten auch vermeiden, value(forKey:) zu verwenden. Und vermeiden Sie unnötige Typdeklarationen. Lassen Sie Swift, wenn es angemessen ist, auf den Typ schließen.

Ihre if sollte sein:

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

Sie sollten auch die Kraft-auspackt vermeiden, wenn Sie sicher sind, dass der Wert (oder gegossen) immer erfolgreich.

Und in Ihrem Code konsistent sein. Auf einer Linie tun Sie:

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

und andere Sie tun:

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

Warum zwei verschiedene Ansätze zu zwingen, den Fall und die optionale?

Verwandte Themen