Swift 3向下转换JSON字典

时间:2016-10-14 13:26:54

标签: json dictionary swift3

我目前正在使用谷歌地图自动完成功能进行ios swift应用程序。在swift 2.0中我确实喜欢这个以获得经度和纬度值:

let dic = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableLeaves) as! NSDictionary  
let lat = dic["results"]?.valueForKey("geometry")?.valueForKey("location")?.valueForKey("lat")?.objectAtIndex(0) as! Double
let lon = dic["results"]?.valueForKey("geometry")?.valueForKey("location")?.valueForKey("lng")?.objectAtIndex(0) as! Double

但是对于swift 3,它已经不再适用了。我该怎么办?

1 个答案:

答案 0 :(得分:1)

  • 首先,使用NSDictionary,使用Swift native Dictionary
  • 其次使用valueForKey,请使用密钥订阅
  • 第三个在Swift中使用mutableContainers,如果您想要更改某些内容,请使用var Dictionary

为方便起见,声明JSON字典的类型别名

typealias JSONDictionary = [String:Any]

在Swift 3中,编译器需要知道所有中间对象的类型,最安全的解决方案是

if let dic = try JSONSerialization.jsonObject(with:data!, options: []) as? JSONDictionary {
  if let results = dic["results"] as? JSONDictionary,
    let geometry = results["geometry"] as? JSONDictionary,
    let location = geometry["location"] as? JSONDictionary,
    let latitudes = location["lat"] as? [Double], !latitudes.isEmpty,
    let longitudes = location["lng"] as? [Double], !longitudes.isEmpty {
      let lat = latitudes[0]
      let lng = longitudes[0]
  }
}

对于那种嵌套的JSON,请考虑使用类似SwiftyJSON的库。