Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 从CLPlacemark创建地址字符串_String_Swift_Optional_Clplacemark - Fatal编程技术网

String 从CLPlacemark创建地址字符串

String 从CLPlacemark创建地址字符串,string,swift,optional,clplacemark,String,Swift,Optional,Clplacemark,有人会建议清洁工从CLPlacemark创建地址字符串吗 目前我正在使用这个扩展 extension CLPlacemark { func makeAddressString() -> String { var address = "" if subThoroughfare != nil { address = address + " " + subThoroughfare! } if thoroughfare != nil { a

有人会建议清洁工从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
    }
}
所有的实例变量都是可选的,因此需要检查nil,我希望街道号、to street等的顺序相同。

这也应该有效

extension CLPlacemark {

  func makeAddressString() -> String {
    // Unwrapping the optionals using switch statement
    switch (self.subThoroughfare, self.thoroughfare, self.locality, self.administrativeArea, self.postalCode, self.country) {
    case let (.Some(subThoroughfare), .Some(thoroughfare), .Some(locality), .Some(administrativeArea), .Some(postalCode), .Some(country)):
        return "\(subThoroughfare), \(thoroughfare), \(locality), \(administrativeArea), \(postalCode), \(country)"
    default:
        return ""
    }
  }
}
查看此帖子以供参考:


编辑-仅当所有选项均为零时,此选项才起作用,如果其中一个选项为零,则案例将不匹配。查看参考链接,了解如何检测可能为零的情况。

您现在可以在一组选项上进行平面映射,以过滤掉零值(我认为这在Swift 2中起作用)。您的示例现在基本上是一行(如果您删除了为可读性而插入的换行符):

您可以更进一步,使用嵌套数组实现更复杂的样式。下面是一个德式缩写地址(
mystreet11030城市
)的示例:


CLPlacemark
具有类型为
CNPostalAddress
postalAddress
属性。您可以使用
CNPostalAddressFormatter
将其格式化为区域设置感知字符串

let formatter = CNPostalAddressFormatter()
let addressString = formatter.string(from: placemark.postalAddress)

我不认为这会起作用,即使一个或两个是零,我需要剩下的部分仍然结合起来形成一个字符串。请把我的答案标记为接受,如果你认为它解决了你的问题。
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"
        }
    }
}
let formatter = CNPostalAddressFormatter()
let addressString = formatter.string(from: placemark.postalAddress)