Swift - NSURL错误

时间:2014-10-30 17:18:09

标签: ios 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.
    }
}

2 个答案:

答案 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会在你遇到问题之前推动你抓住意想不到的值。