Dog*_*fee 3 string optional swift clplacemark
任何人都可以建议清洁工从 CLPlacemark 创建地址字符串。
目前我正在使用这个扩展
extension CLPlacemark {
func makeAddressString() -> String {
var address = ""
if subThoroughfare != nil { address = address + " " + subThoroughfare! }
if thoroughfare != nil { address = address + " " + thoroughfare! }
if locality != nil { address = address + " " + locality! }
if administrativeArea != nil { address = address + " " + administrativeArea! }
if postalCode != nil { address = address + " " + postalCode! }
if country != nil { address = address + " " + country! }
return address
}
}
Run Code Online (Sandbox Code Playgroud)
所有实例变量都是可选的,因此检查 nil,我希望以相同的街道号顺序,到街道等。
CLPlacemark有一个postalAddress类型的属性CNPostalAddress。您可以格式化成一个区域识别使用字符串CNPostalAddressFormatter。
let formatter = CNPostalAddressFormatter()
let addressString = formatter.string(from: placemark.postalAddress)
Run Code Online (Sandbox Code Playgroud)
您现在可以在 Optionals 数组上进行 flatMap 以过滤掉 nil 值(我认为这从 Swift 2 开始就有效)。你的例子现在基本上是一个单行(如果你删除我为了可读性而插入的换行符):
extension CLPlacemark {
func makeAddressString() -> String {
return [subThoroughfare, thoroughfare, locality, administrativeArea, postalCode, country]
.flatMap({ $0 })
.joined(separator: " ")
}
}
Run Code Online (Sandbox Code Playgroud)
您可以更进一步,并使用嵌套数组来实现更复杂的样式。以下是德式缩写地址 ( MyStreet 1, 1030 City)的示例:
extension CLPlacemark {
var customAddress: String {
get {
return [[thoroughfare, subThoroughfare], [postalCode, locality]]
.map { (subComponents) -> String in
// Combine subcomponents with spaces (e.g. 1030 + City),
subComponents.flatMap({ $0 }).joined(separator: " ")
}
.filter({ return !$0.isEmpty }) // e.g. no street available
.joined(separator: ", ") // e.g. "MyStreet 1" + ", " + "1030 City"
}
}
}
Run Code Online (Sandbox Code Playgroud)