尝试使用下面的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.
}
}
答案 0 :(得分:6)
您正在调用的 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!)
最好的解决方案是检查(解包)这些选项,即使您确定它们包含值!
您可以在此处找到有关期权的更多信息:link to official Apple documentation。
答案 1 :(得分:0)
如评论中所述,编译器会告诉您确切要做什么,Xcode会提供修复程序,呃,修复它。
以下是为什么:NSData
的{{1}}初始值设定项采用了非可选的init(contentsOfURL:)
引用。这意味着你不能通过传递NSURL
而不是URL来初始化数据对象 - 这样做是荒谬的。 (如果你真的想创建一个空的nil
,请使用一个在语义上更合适的初始化程序。)这也意味着你不能传递一个具有可能性的引用零 - 即optional。
当您收到可选项时,需要在传递给需要非可选引用的代码之前进行检查和解包。 (请参阅 Swift编程语言的上述部分,了解您可以执行此操作的所有方法。)这样做可以限制代码中的失败点数 - 而不是在API调用后面有几层代码打破,因为你传递了一些你没想到的东西,Swift会在你遇到问题之前推动你抓住意想不到的值。