使用Swift的Map api和Objective-c的valueForKeyPath

时间:2015-04-23 06:23:33

标签: objective-c json swift

给定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;是零合并算子不是吗?

不过,我这样做是游乐场

2 个答案:

答案 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" ]! } )

就是答案。