[英]Swift - NSURL error
尝试使用下面的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!)
最好的解决方案是检查(解包)这些选项,即使您确定它们包含值!
您可以在此处找到更多关于选项的信息: 链接到官方Apple文档 。
正如评论中所指出的,编译器会告诉您确切要做什么,并且Xcode提供了一个修复程序 - 呃,修复它。
原因如下: NSData
的init(contentsOfURL:)
初始化程序采用非可选的NSURL
引用。 这意味着你不能通过传递nil
而不是URL来初始化数据对象 - 这样做是荒谬的。 (如果你真的想创建一个空的NSData
,请使用一个在语义上更合适的初始化程序。)这也意味着你不能传递一个可能是nil的引用 - 也就是说,是一个可选的 。
当您收到可选项时,需要在传递给需要非可选引用的代码之前检查并解包它。 (请参阅Swift编程语言的上述部分,了解您可以执行此操作的所有方法。)这样做可以限制代码中的失败点数 - 而不是让API调用中断几层代码,因为您通过了它没想到,Swift会在你成为一个问题之前推动你抓住意想不到的价值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.