私はGoogle Places API for iOSを使用しており、近くの場所を正常に取得して住所を文字列として表示できます。私がやろうとしているのは、都市などの住所コンポーネントを抽出してデータベースに格納することです。
ドキュメントには、GMSPlaceにaddressComponentsプロパティ(配列)があることが示されていますが、このプロパティの使用方法がわかりません。
以下のコードは、アドレス全体をラベルのテキストに設定しますが、それを超えることはできません。
編集----アドレスコンポーネントにアクセスする方法を示すコードを追加しました
venueLabel.isHidden = false
venueLabel.text = selectedPlace?.name
addressLabel.isHidden = false
addressLabel.text = selectedPlace?.formattedAddress
let addressComponents = selectedPlace?.addressComponents
for component in addressComponents! {
let city = component["city"] //Error Type GMSPaceAddressComponent has no subscript members
print(city)
}
安全なSwift 4.2ソリューション:
let name = place.addressComponents?.first(where: { $0.type == "city" })?.name
selectedPlace.addressComponentsは、2つのプロパティタイプと名前を持つGMSAddressComponentの配列です。あなたの場合それはのようになります
for component in addressComponents! {
if component.type == "city" {
print(component.name)
}
}
GMSAddressComponentは、このエラーが発生している辞書や配列ではないクラスです。
追加のコンポーネントタイプは link から参照できます。
スウィフト4
var keys = [String]()
place.addressComponents?.forEach{keys.append($0.type)}
var values = [String]()
place.addressComponents?.forEach({ (component) in
keys.forEach{ component.type == $0 ? values.append(component.name): nil}
})
print(values)
最新のGoogle Places API(2019年7月)の場合、これが役立ちます。実際、Googleは各要素にいくつかのタイプを配置しています。そのため、「タイプ」は非推奨となり、「タイプ」は新たに提出されました。
あなたはこのようなことをすることができます:
for addressComponent in (self.mySelectedPlace?.addressComponents)! {
for type in (addressComponent.types){
switch(type){
case "country":
var country = addressComponent.name
case "postal_code":
var postCode = addressComponent.name
default:
break
}
}
}
私の後に続く人たちのために、私はこれをObjective-Cのどこにも見つけることができませんでした:
for (int i = 0; i < [place.addressComponents count]; i++)
{
NSLog(@"name %@ = type %@", place.addressComponents[i].name, place.addressComponents[i].type);
}
var keys = [String]()
place.addressComponents?.forEach{keys.append($0.type)}
var values = [String]()
place.addressComponents?.forEach({ (component) in
keys.forEach{ component.type == $0 ? values.append(component.name): nil}
print("All component type \(component.type)")
if component.type == "locality"{
print("This is city name \(component.name)")
}
})
print(values)
for ( GMSAddressComponent * component in place.addressComponents) {
if ( [component.type isEqual: @"locality"] )
{
NSLog(@"Current city %@ ", component.name);
}
}
私はこの拡張機能を使用しています:
extension Array where Element == GMSAddressComponent {
func valueFor(placeType: String, shortName: Bool = false) -> String? {
let result = self.first(where: {
$0.types.first(where: { $0 == placeType }) == placeType
})
return shortName ? result?.shortName : result?.name
}
}
使用法:
let place: GMSPlace
// ...
place.addressComponents?.valueFor(placeType: kGMSPlaceTypeRoute, shortName: true)