Swift 2.0 fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

Swift 2.0 fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

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

在上面一行,我遇到了致命错误

fatal error: unexpectedly found nil while unwrapping an Optional value (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' 它 returns 数据库中的名称正确,但无法保留图像

它导致错误而 运行。

不要强制解包...使用 if let 以避免崩溃...

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

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

尝试使用 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()

你这么说

if i printed the 'ImageName' it returns the name from the database correctly

那一定意味着 ImageName 对 URL

无效

如果您查看 NSURL(string:)description,它会显示:

The URL string with which to initialize the NSURL object. This URL string must conform to URL format as described in RFC 2396, and must not be nil. This method parses URLString according to RFCs 1738 and 1808.

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

除此之外,使用 ? 而不是 @PhillipMills 所说的 ! 总是一个好主意

更新:我看到您现在已经发布了您的 URL 的示例。如果我在操场上这样做:

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

我在 return 中得到 nil,所以看来 URL 和 NSURL 不是最好的朋友。

更新 2:嗯,我猜我说得很快,如果你看上面的内容,你会发现我在 [=74= 之前有一个 space ] 部分,如果我将其更改为:

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

它确实有效,我得到了一个 NSURL 对象。

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

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

因此您以后不必将其包装在 \()

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

你可以简单地说:

让图像URL = NSURL(string: ImageName)

然后...正如其他人所说,使用 ? 而不是 !

始终是个好主意

所以你可以这样写:

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

平安无事

请尝试以下代码:

    //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()