Swift 2.0致命错误:在展开Optional值(lldb)时意外发现nil

时间:2016-03-23 12:37:15

标签: ios swift fatal-error nsurl optional-values

let imgURL:NSURL = NSURL(string: "\(ImageName)")!

在上面一行,我正在致命的错误

  

致命错误:在展开Optional值时意外发现nil   (lldb)

代码:

let ImageName = obj["image"] as! String

 let imgURL:NSURL = NSURL(string: "\(ImageName)")!
 let request: NSURLRequest = NSURLRequest(URL: imgURL)

  let session = NSURLSession.sharedSession()

  let Imgtask = session.dataTaskWithRequest(request){
                            (data, response, error) -> Void in

   if (error == nil && data != nil)
    {
       func display_image()
       {
           pointAnnoation.DisplayImage = UIImage(data: data!)
        }
        dispatch_async(dispatch_get_main_queue(), display_image)
     }

   }

   Imgtask.resume()

从上面的代码中我试图在注释

中存储来自数据库的图像

如果我打印'ImageName',它会正确地从数据库中返回名称,但无法保留图像

它在运行时导致错误。

4 个答案:

答案 0 :(得分:3)

你说那个

  

如果我打印'ImageName',它会正确地从数据库中返回名称

然后,这必须意味着ImageName对于网址无效

如果您查看NSURL(string:)的{​​{3}},则说:

  

用于初始化NSURL对象的URL字符串。此URL字符串必须符合RFC 2396中所述的URL格式,且不得为零。此方法根据RFC 1738和1808解析URLString。

所以问题是...... ImageName看起来怎么样?你可以从中创建一个URL吗?

除此之外,使用?代替!始终是个好主意,因为@PhillipMills说

更新:我现在可以看到您发布了一个网址示例。如果我在操场上这样做:

let url = NSURL(string: " goo.gl/pBmA0d")

我得到nil作为回报,所以看起来短网址和NSURL并不是最好的朋友。

更新2 :嗯,我想快速说话,如果你看一下上面你可以看到我在goo.gl部分之前有空格,如果我改为:

let url = NSURL(string: "goo.gl/pBmA0d")

它实际上有效,我得到一个NSURL对象。

但是我在你的代码中偶然发现了另一件事。您在此处将ImageName声明为字符串:

let ImageName = obj["image"] as! String

所以你不必在\()稍后将其包装在

let imgURL:NSURL = NSURL(string: "\(ImageName)")!

你可以简单地说:

让imageURL = NSURL(字符串:ImageName)

然后......正如其他人所说,使用?代替!

总是一个好主意

所以你可以写:

if let imageName = obj["image"] as? String,
   let imageURL = NSURL(string: imageName) {
   //we're in business :-)
}

安然无恙

答案 1 :(得分:2)

尝试使用guardif let来帮助自己。

let ImageName = obj["image"] as! String

 if let imgURL = NSURL(string: ImageName) {
     let request: NSURLRequest = NSURLRequest(URL: imgURL)

     let session = NSURLSession.sharedSession()

     let Imgtask = session.dataTaskWithRequest(request){ (data, response, error) -> Void in

        if (error == nil && data != nil)
        {
            // What's that func??
            func display_image()
            {
                pointAnnoation.DisplayImage = UIImage(data: data!)
            }
            dispatch_async(dispatch_get_main_queue(), display_image)
         }

       }
 }
 Imgtask.resume()

答案 2 :(得分:0)

不要强制打开...如果让我们避免崩溃......

 if let img = obj["image"] as? String, 
      imgURL = NSURL(string: img) {

     // ... continue with your code ...
 }

答案 3 :(得分:0)

请尝试以下代码:

    //ImageName is a String type.

    guard  let ImageName = obj["image"] as? String , let imgURL = NSURL(string: ImageName) else{
        return 
    }
    let request: NSURLRequest = NSURLRequest(URL:imgURL)

    let session = NSURLSession.sharedSession()

    let Imgtask = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in

        if (error == nil && data != nil)
        {
            func display_image()
            {
                pointAnnoation.DisplayImage = UIImage(data: data!)
            }
            dispatch_async(dispatch_get_main_queue(), display_image)
        }

    Imgtask.resume()