2014-10-30 5 views
6

Beim Versuch, die unten angegebene NSURL Klasse zu verwenden, versucht der folgende Code im Wesentlichen, ein Bild zu speichern, das ich von Facebook in ein imageView einziehe. Der Fehler lautet wie folgt:Swift - NSURL-Fehler

value of optional type 'NSURL?' not unwrapped, did you mean to use '!' or '?' 

Nicht sicher, warum dies geschieht, Hilfe!

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var myImage: UIImageView! 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     let myProfilePictureURL = NSURL(string: "http://graph.facebook.com/bobdylan/picture") 
     let imageData = NSData(contentsOfURL: myProfilePictureURL) 
     self.myImage.image = UIImage(data: imageData) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 
+7

Eigentlich sagt Ihnen der Compiler genau, was zu tun ist. –

+0

Tun Sie einfach 'NSData (contentsOfURL: myProfilePictureURL!)' '!' Am Ende. – iphonic

+0

Da @MartinR sagte, dass Sie diese Warnung stummschalten müssen, indem Sie auf die rote Warnung klicken, drücken Sie die Eingabetaste und bauen Sie sie auf. – EridB

Antwort

6

Der NSURL Konstruktor Sie anrufen diese Signatur bekam:

convenience init?(string URLString: String) 

? bedeutet, dass der Konstruktor möglicherweise keinen Wert zurückgibt und daher als optional gilt.

Das Gleiche gilt für die NSData Konstruktor:

init?(contentsOfURL url: NSURL) 

Eine schnelle Lösung ist:

let myProfilePictureURL = NSURL(string: "http://graph.facebook.com/bobdylan/picture") 
let imageData = NSData(contentsOfURL: myProfilePictureURL!) 
self.myImage.image = UIImage(data: imageData!) 

Die beste Lösung (unwrap) diese optionals zu überprüfen ist, auch wenn Sie sicher sind, dass sie einen Wert enthalten!

Weitere Informationen zu Optionen finden Sie hier: link to official Apple documentation.

+1

Danke Matteo, schätze die Hilfe hier. Es läuft jetzt gut. –

0

Wie in den Kommentaren erwähnt, teilt Ihnen der Compiler genau mit, was zu tun ist, und Xcode bietet einen Fix-it, um es zu reparieren.

Hier ist die warum: NSData ‚s init(contentsOfURL:) initializer einen nicht-optionalen NSURL Bezug nimmt. Das bedeutet, dass Sie kein Datenobjekt initialisieren dürfen, indem Sie anstelle einer URL nil übergeben - dies wäre unsinnig. (Wenn Sie wirklich eine leere NSData erstellen möchten, verwenden Sie einen Initialisierer, der dafür semantisch geeignet ist.) Es bedeutet auch, dass Sie eine Referenz nicht übergeben können, die die Möglichkeit von null - das heißt eine optional hat.

Wenn Sie ein optionales Element erhalten, müssen Sie es vor dem Übergeben an Code, der eine nicht optionale Referenz erhalten möchte, prüfen und auspacken. (Siehe hierzu den zuvor genannten Teil von Die Swift-Programmiersprache für all das, was Sie tun können.) Dadurch wird die Anzahl der Fehlerpunkte in Ihrem Code begrenzt - anstatt Code mehrere Schichten tief hinter einem API-Aufruf zu haben, der bricht, weil Sie ihn überschritten haben etwas, was du nicht erwartet hast, Swift bringt dich dazu, unerwartete Werte zu erkennen, bevor sie ein Problem werden.