给定http://jsonplaceholder.typicode.com/users
为简单起见,这里是json的删节版本
var userDict: [[String, String]]? <-- String json converts into foundation and saved here
// The Json
[{
"address" : {
"geo" : {
"lat" : "-37.3159"
}
}
}]
我想获得一个lat数组,它是地址的地理点的纬度。我有两个选择,swift或objective-c
我可以使用旧的valueForKeyPath:方法获取一个lat数组
var keypathLatitude: [String] = (userDict! as NSArray).valueForKeyPath("address.geo.lat") as! [String] // Objective-c api
哪会给我[&#34; -37.3159&#34;]这是一个包含一个元素的数组。 但是我很难用swift的map api
来做这件事var mapLatitude: [String] = userDict!.map({$0["address"]?["geo"]["lat"] as! String}) // <-- Does not like this. But I want ["-37.3159"] as a result.
更新
var mapLatitude: [String] = userDict!.map({$0["address"]?["geo"]??["lat"] as! String})
使用mattdaw的建议我添加了另一个&#39;?&#39;。那没起效。奇怪的是,当我添加&#39;&#39;它似乎按预期工作。 .... 但为什么? &#39;&#39;&#39;是零合并算子不是吗?
不过,我这样做是游乐场答案 0 :(得分:1)
使用纯Swift对象,可选链接工作:
let users = [ [ "address": [ "geo": [ "lat": "-37.3159" ] ] ] ]
let lats = users.map { $0["address"]?["geo"]?["lat"] }
println(lats)
...但是当你处理通过NSJSONSerialization解析JSON的结果时,它变得很难看。查看SwiftyJSON(https://github.com/lingoer/SwiftyJSON)了解更多背景信息。
答案 1 :(得分:0)
您需要指定要返回的类型并将每个元素转换为字典。(Xcode 6.3.1)
let mapLatitude = userDict.map { p -> String in
let wAddress = p[ "address" ] as! [ String: AnyObject ]
let wGeo = wAddress[ "geo" ] as! [ String: AnyObject ]
return wGeo[ "lat" ] as! String
}
编辑:
如果你不喜欢啰嗦
var mapLatitude = userDict.map( { $0[ "address" ]![ "geo" ]![ "lat" ]! } )
就是答案。