2017-06-25 9 views
0

通常、私は辞書に入って、一度値を見つけます。この場合は、ステップインしてループスルーして値を見つけ出し、再度ステップアウトしてから別の値を見つける必要があります。例:値を見つけるために辞書をルーピング

address_components": [ 
{ 
    "long_name": "E3 2AA", 
    "short_name": "E3 2AA", 
    "types": [ 
     "postal_code" 
    ] 
}, 
{ 
    "long_name": "London", 
    "short_name": "London", 
    "types": [ 
     "postal_town" 
    ] 
} 
] 

これはどのように見えるかをAPI辞書をグーグルと私は思いpostal_townlong_nameをフェッチする必要があります。

+0

を'address_components'の値は配列です(角括弧で示されます)。 – vadian

+0

@vadianはい、申し訳ありませんが言及を忘れた。それでも、値を取得しようとすると私はまだ問題です(郵便都市は常に1のインデックス値ではありません)。 – luke

答えて

2

あなたはtypeをフィルタリングするためにクロージャを渡すfirst(where:機能を使用することができ、これはループを回避:

if let addressComponents = json["address_components"] as? [[String:Any]], 
    let postalTownComponent = addressComponents.first(where: { ($0["types"] as! [String]).contains("postal_town") }) { 
    print(postalTownComponent["long_name"]) 
} 
0

address_componentsは配列なので、ループオーバーしてキーの値を確認できます。次のようなものがあります。

var names = [] 

for entry in addressComponent { 
    if addressComponent["types"][0] == "postal_town" { 
     names.append(addressComponent["long_name"]) 
    } 
} 
0

あなたの質問に間違いがありますか?例:

let dict = [ "long_name": "E3 2AA", "short_name": "E3 2AA"] 
for (key, value) in dict { 
    print("your key: \(key) and value: \(value)") 
} 
2

これはあなたのためにそれを行う必要があります。

let result = addressComponents.filter({ return ($0["types"] as! [String]).contains("postal_town") }).map({ $0["long_name"] }) 
関連する問題