从 CLPlacemark 创建地址字符串

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,我希望以相同的街道号顺序,到街道等。

ale*_*kop 6

CLPlacemark有一个postalAddress类型的属性CNPostalAddress。您可以格式化成一个区域识别使用字符串CNPostalAddressFormatter。

let formatter = CNPostalAddressFormatter()
let addressString = formatter.string(from: placemark.postalAddress)
Run Code Online (Sandbox Code Playgroud)


man*_*mal 5

您现在可以在 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)