web-dev-qa-db-ja.com

iOS 9で文字列にCLPlacemark

CLPlacemarkを文字列にフォーマットしたい。

よく知られている方法はABCreateStringWithAddressDictionaryを使用することですが、iOS 9では非推奨になりました。代わりにCNPostalAddressFormatterを使用するよう警告が表示されます。

ただし、CNPostalAddressFormatterCNPostalAddressのみをフォーマットできます。 CLPlacemarkCNPostalAddressに正しく変換する方法はありません。これら3つのプロパティのみがCLPlacemarkおよびCNPostalAddresscountryISOcountryCode、およびpostalCodeによって共有されます。

では、CLPlacemarkを文字列にフォーマットするにはどうすればよいですか?

目印のaddressDictionaryを取得し、その"FormattedAddressLines"キーを使用してアドレス文字列を抽出します。これは文字列の行の配列であることに注意してください。

(ただし、Apple開発者は、アドレス帳とCLPlacemark間の交換について完全に忘れてしまったようです。これは連絡先フレームワークの重大なバグです-多くの1つ。)


[〜#〜] edit [〜#〜]最初にその回答を投稿したので、Appleこのバグを修正しました。CLPlacemarkにpostalAddressが追加されましたプロパティはCNPostalAddressであり、CNPostalAddressFormatterを使用して、複数行のニースアドレス文字列を取得できます。必ずimport Contacts

27
matt

Swift 3.0

if let lines = myCLPlacemark.addressDictionary?["FormattedAddressLines"] as? [String] {
    let placeString = lines.joined(separator: ", ")
    // Do your thing
}
15
guido

Swift 3.0ヘルパーメソッド

class func addressFromPlacemark(_ placemark:CLPlacemark)->String{
        var address = ""

        if let name = placemark.addressDictionary?["Name"] as? String {
            address = constructAddressString(address, newString: name)
        }

        if let city = placemark.addressDictionary?["City"] as? String {
            address = constructAddressString(address, newString: city)
        }

        if let state = placemark.addressDictionary?["State"] as? String {
            address = constructAddressString(address, newString: state)
        }

        if let country = placemark.country{
          address = constructAddressString(address, newString: country)
        }

        return address
      }
2
Sourabh Sharma