web-dev-qa-db-ja.com

GMSPlace住所コンポーネントから通り、都市などを抽出する方法

私は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)
            }
10
Martin Muldoon

安全な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 から参照できます。

13
Surjeet Rajput

スウィフト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) 
4
Giang

最新の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
                }

            }
        }
3
msamardzic

私の後に続く人たちのために、私はこれをObjective-Cのどこにも見つけることができませんでした:

for (int i = 0; i < [place.addressComponents count]; i++)
{
    NSLog(@"name %@ = type %@", place.addressComponents[i].name, place.addressComponents[i].type);
}
1
LeviXC
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)
0
Dilip Bhuva
for ( GMSAddressComponent * component in place.addressComponents) {
    if ( [component.type  isEqual: @"locality"] )
    {
        NSLog(@"Current city %@ ", component.name);
    }
}
0
zap

私はこの拡張機能を使用しています:

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)
0
Ramis