2016-08-04 77 views
-2

我的另一个问题被标记为与另一个问题相同,但它没有回答我遇到的问题。从anyobject字典中提取数值到数组

下面是代码:

if status == "OK" { 


    self.selectedRoute = (dictionary["routes"] as! Array<Dictionary<NSObject, AnyObject>>)[0] 
    self.overviewPolyline = self.selectedRoute["overview_polyline"] as! Dictionary<NSObject, AnyObject> 

    let legs = self.selectedRoute["legs"] as! Array<Dictionary<NSObject, AnyObject>> 
    let steps = legs[0]["steps"]! 

    for i in 0...steps.count - 1 { 
     let step_coordinate = steps[i]["start_location"]! 
     print(step_coordinate!["lat"]!!) 

    } 

} 

print语句给出了这样的结果

40.7609205 
40.7640121 
40.7595325 
40.7501637 
40.7481923 
40.7393448 
40.7252038 
40.7225337 
40.718295 

,但如果我换print语句出来抢值,并把它们放在一个数组我得到的致命错误:发现无。

有人可以解释为什么会出现这种情况吗?如果不通过for循环,我如何获取这些值?

+3

请你帮个忙,尽量不要使用'作为!'和其他力展开操作。相反,您应该正确地测试并展开“可选”值。强制解包可能导致令人讨厌的,难以发现的运行时异常。此外,尝试使用[最小化,完整和可验证的示例](http://stackoverflow.com/help/mcve) – ColGraff

+1

'为我在0 ... steps.count - 1'可以只是: '为我在0 .. Alexander

+0

@ColGraff你是对的谢谢。我会尽量避免在将来做这件事。我不确定如何调整示例,因为我只是在寻找一种方法来存储上面显示的来自step_coordinate [“lat”]的值。我试图把它当作一个数组来对待,并且它失败了,所以我不知道如何去抓它们。 – tryingtolearn

回答

1

下面是您的代码清洁版本。

规则:

  1. 不要强行展开任何东西!
  2. 可选地投射来自[NSObject: AnyObject]查找的值。
  3. 使用guard声明和if let安全地打开可选项。
  4. 请勿在未先检查的情况下对可能为空的数组进行索引。

if status == "OK" { 
    guard let routes = dictionary["routes"] as? [[NSObject: AnyObject]] else { return } 
    self.selectedRoute = routes.first ?? [:] 

    self.overviewPolyline = self.selectedRoute["overview_polyline"] as? [NSObject: AnyObject] ?? [:] 

    guard let legs = self.selectedRoute["legs"] as? [[NSObject: AnyObject]] else { return } 

    let firstleg = legs.first ?? [:] 
    guard let steps = firstleg["steps"] as? [[NSObject: AnyObject]] else { return } 

    for step in steps { 
     if let step_coordinate = step["start_location"] as? [NSObject: AnyObject] { 
      if let lat = step_coordinate["lat"] as? Double { 
       print(lat) 

       // append lat to array of lats 
       lats.append(lat) 
      } 
     } 
    } 
} 
+0

哇,非常感谢这正是我所需要的。清理后的代码让我更容易访问变量。干杯。 – tryingtolearn