Swift – NSURL错误

尝试使用下面的NSURL类时出现错误,下面的代码基本上试图存储我从Facebook拉入imageView 。 错误如下:

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

不知道为什么这是发生,帮助!

 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. } } 

你调用的NSURL构造函数已经得到了这个签名:

 convenience init?(string URLString: String) 

意味着构造函数可能不会返回一个值,因此它被认为是可选的

NSData构造函数也一样:

 init?(contentsOfURL url: NSURL) 

快速解决方法是:

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

最好的解决scheme是检查(解包)这些可选项,即使你确定它们包含一个值!

你可以在这里find更多关于optionals的信息: 链接到官方的Apple文档 。

正如评论中指出的那样,编译器会告诉你到底该做什么,Xcode提供了一个修复方法,呃修复它。

原因如下: NSDatainit(contentsOfURL:)初始化器接受一个非可选的NSURL引用。 这意味着你不允许通过传递nil而不是URL来初始化一个数据对象 – 这样做将是荒谬的。 (如果你真的想创build一个空的NSData ,使用一个更适合于这样做的语义上的初始化。)这也意味着你不能传递一个可能为零的引用 – 也就是说,一个可选的 。

当你收到一个可选的代码时,你需要检查并打开它,然后传递给需要非可选引用的代码。 (请参阅Swift编程语言的上述部分,了解所有可以做到这一点的方法。)这样做会限制代码中的失败点的数量,而不是让代码在API调用中断后数层深,因为您传递了某些东西没想到的是,Swift让你在出现问题之前赶上意想不到的价值。