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提供了一个修复方法,呃修复它。
原因如下: NSData
的init(contentsOfURL:)
初始化器接受一个非可选的NSURL
引用。 这意味着你不允许通过传递nil
而不是URL来初始化一个数据对象 – 这样做将是荒谬的。 (如果你真的想创build一个空的NSData
,使用一个更适合于这样做的语义上的初始化。)这也意味着你不能传递一个可能为零的引用 – 也就是说,一个可选的 。
当你收到一个可选的代码时,你需要检查并打开它,然后传递给需要非可选引用的代码。 (请参阅Swift编程语言的上述部分,了解所有可以做到这一点的方法。)这样做会限制代码中的失败点的数量,而不是让代码在API调用中断后数层深,因为您传递了某些东西没想到的是,Swift让你在出现问题之前赶上意想不到的价值。