CLPlacemark
を文字列にフォーマットしたい。
よく知られている方法はABCreateStringWithAddressDictionary
を使用することですが、iOS 9では非推奨になりました。代わりにCNPostalAddressFormatter
を使用するよう警告が表示されます。
ただし、CNPostalAddressFormatter
はCNPostalAddress
のみをフォーマットできます。 CLPlacemark
をCNPostalAddress
に正しく変換する方法はありません。これら3つのプロパティのみがCLPlacemark
およびCNPostalAddress
:country
、ISOcountryCode
、およびpostalCode
によって共有されます。
では、CLPlacemark
を文字列にフォーマットするにはどうすればよいですか?
目印のaddressDictionary
を取得し、その"FormattedAddressLines"
キーを使用してアドレス文字列を抽出します。これは文字列の行の配列であることに注意してください。
(ただし、Apple開発者は、アドレス帳とCLPlacemark間の交換について完全に忘れてしまったようです。これは連絡先フレームワークの重大なバグです-多くの1つ。)
[〜#〜] edit [〜#〜]最初にその回答を投稿したので、Appleこのバグを修正しました。CLPlacemarkにpostalAddress
が追加されましたプロパティはCNPostalAddressであり、CNPostalAddressFormatterを使用して、複数行のニースアドレス文字列を取得できます。必ずimport Contacts
!
if let lines = myCLPlacemark.addressDictionary?["FormattedAddressLines"] as? [String] {
let placeString = lines.joined(separator: ", ")
// Do your thing
}
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
}