展开可选值时意外发现 nil 错误

Posted

技术标签:

【中文标题】展开可选值时意外发现 nil 错误【英文标题】:error unexpectedly found nil while unwrapping an Optional value 【发布时间】:2016-02-05 07:36:31 【问题描述】:

使用 alamofire 调用时https://maps.googleapis.com/maps/api/directions/json?origin=(self.startlat,self.startlng)&destination=(self.endlat,self.endlng)

我一直收到这个错误:

'致命错误:在展开可选值时意外发现 nil'

我也试试这个

if let slat = startlat 
    if let slng = self.startlng 
        if let elat = self.endlat 
            if let elng = self.endlng 
                Alamofire.request(.GET, "https://maps.googleapis.com/maps/api/directions/json?origin=\(slat,slng)&destination=\(elat,elng)" , encoding: .JSON)
                .responseJSON  response in
                    let res = response.result.value!
                    self.estimatedDistance = (res["routes"]!![0]["legs"]!![0]["distance"]!!["value"] as! Int)/1000
                    self.estimatedTime = (res["routes"]!![0]["legs"]!![0]["duration"]!!["value"] as! Int)/60
                    print("\(self.estimatedDistance) - \(self.estimatedTime)")

               
            
        
    

但我仍然遇到同样的错误。

【问题讨论】:

guard/else 是你的朋友 ;) 您仍然有几个强制展开。调试器光标指向哪一行? 保持强制展开从来都不是一个好主意,如果你对if letguard let 感到懒惰,那么考虑使用Swifty JSON,它会有所帮助 【参考方案1】:

来自 Google api 调用的 JSON 结果:


   "geocoded_waypoints" : [
      
         "geocoder_status" : "ZERO_RESULTS"
      ,
      
         "geocoder_status" : "ZERO_RESULTS"
      
   ],
   "routes" : [],
   "status" : "NOT_FOUND"

您似乎正在尝试访问res["routes"][0]!!,但在这种情况下(在您的链接中)res["routes"] JSON 元素是一个空数组。

【讨论】:

但是这个直接价值链接“maps.googleapis.com/maps/api/directions/…”是有效的 是的链接完全正常,但在路由元素中,您试图获取数组的第一个值,但数组为空。您必须在获取其中一个之前检查数组是否有值。 "'(self.startlat)'" 自动在字符串中添加“(”如何避免??

以上是关于展开可选值时意外发现 nil 错误的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 平面错误:在展开可选值时意外发现 nil

@IBInspectable 致命错误:在展开可选值时意外发现 nil

为啥我收到错误:致命错误:在展开可选值时意外发现 nil?

展开可选值时意外发现 nil 错误

UIPickerView:在展开可选值时意外发现 nil

swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称