2015-04-23 43 views
0

鑑於http://jsonplaceholder.typicode.com/users過濾用斯威夫特的地圖API和Objective-C的valueForKeyPath

爲了簡單起見這裏JSON對象是JSON的刪節版

var userDict: [[String, String]]? <-- String json converts into foundation and saved here 

// The Json 
[{ 
    "address" : { 
    "geo" : { 
     "lat" : "-37.3159" 
    } 
    } 
}] 

我想獲得的緯度數組是地址的地理點的緯度。我有兩個選擇,迅速或Objective-C的

我可以得到一個數組LAT使用舊valueForKeyPath:方法

var keypathLatitude: [String] = (userDict! as NSArray).valueForKeyPath("address.geo.lat") as! [String] // Objective-c api 

這將使我[「-37.3159」]這是一個數組元件。 但我有困難與SWIFT的地圖API

var mapLatitude: [String] = userDict!.map({$0["address"]?["geo"]["lat"] as! String}) // <-- Does not like this. But I want ["-37.3159"] as a result. 

UPDATE

var mapLatitude: [String] = userDict!.map({$0["address"]?["geo"]??["lat"] as! String}) 

做它用mattdaw的建議我增加了一個 '?'。它不起作用。奇怪的是,當我添加'??'它似乎按需要工作。 .... 但爲什麼? '??'是零合併運營商是不是?

順便說一句,我這樣做是遊樂場

回答

1

純斯威夫特對象,可選鏈接的作品:

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)瞭解更多背景。

+0

我更新了我的答案,使用'?'運營商。 map({$ 0 [「address」]?[「geo」]?[「lat」]不起作用,但是這樣做:map({$ 0 [「address」]?[「geo」] ?? [「lat」 ]這個SwiftyJson看起來非常整齊! – DerrickHo328

0

你需要指定類型返回,並投各elemnt爲詞典(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" ]! }) 

就是答案。

+0

非常真實,當然可以細分到細節層次,但它看起來過於冗長(我認爲Objective-c是冗長的!) – DerrickHo328