Swift 中的 CLGeocoder - 使用 reverseGeocodeLocation 时无法返回字符串

Posted

技术标签:

【中文标题】Swift 中的 CLGeocoder - 使用 reverseGeocodeLocation 时无法返回字符串【英文标题】:CLGeocoder in Swift - unable to return string when using reverseGeocodeLocation 【发布时间】:2015-03-23 19:44:24 【问题描述】:

我正在尝试使用 CLGeocoder 在字符串中返回坐标位置。我的代码目前如下所示:

func getPlaceName(latitude: Double, longitude: Double) -> String 

let coordinates = CLLocation(latitude: latitude, longitude: longitude)
var answer = ""

CLGeocoder().reverseGeocodeLocation(coordinates, completionHandler: (placemarks, error) -> Void in
    if (error != nil) 
        println("Reverse geocoder failed with an error" + error.localizedDescription)
answer = ""
    

    if placemarks.count > 0 
        let pm = placemarks[0] as CLPlacemark
        answer = displayLocationInfo(pm)
     else 
        println("Problems with the data received from geocoder.")
answer = ""
    
)

return answer



func displayLocationInfo(placemark: CLPlacemark?) -> String

if let containsPlacemark = placemark


    let locality = (containsPlacemark.locality != nil) ? containsPlacemark.locality : ""
    let postalCode = (containsPlacemark.postalCode != nil) ? containsPlacemark.postalCode : ""
    let administrativeArea = (containsPlacemark.administrativeArea != nil) ? containsPlacemark.administrativeArea : ""
    let country = (containsPlacemark.country != nil) ? containsPlacemark.country : ""

    println(locality)
    println(postalCode)
    println(administrativeArea)
    println(country)

    return locality

 else 

    return ""




一切似乎都在工作,除了能够从 getPlaceNames() 返回字符串。我只得到以下返回:

Optional("")

displayLocationInfo() 函数似乎可以正常工作,因为 println() 运行良好。所以我相信 getPlaceName() 函数确实是从 displayLocationInfo() 获取位置字符串。

有什么想法吗?谢谢。

【问题讨论】:

reverseGeocodeLocation 是异步的。您的 return 语句将在 reverseGeocodeLocation 完成之前在主线程上执行。 有没有简单的方法解决这个问题?我试过直接从 CLGeocoder() 返回,但它告诉我我不能返回一个字符串,因为它是无效的。我玩过并试图告诉它返回一个字符串,但它显然也不喜欢那样。谢谢。 您应该为您的函数 getPlaceName 设置一个完成块,并通过该块传递答案,而不是尝试使用 return 语句 我发布了一个使用完成块制作函数的示例 【参考方案1】:

由于reverseGeocodeLocation 是一个异步函数,您需要让您的getPlaceName 函数通过块而不是返回语句将答案传回。示例:

func getPlaceName(latitude: Double, longitude: Double, completion: (answer: String?) -> Void) 

   let coordinates = CLLocation(latitude: latitude, longitude: longitude)

   CLGeocoder().reverseGeocodeLocation(coordinates, completionHandler: (placemarks, error) -> Void in
       if (error != nil) 
           println("Reverse geocoder failed with an error" + error.localizedDescription)
           completion(answer: "")
        else if placemarks.count > 0 
           let pm = placemarks[0] as CLPlacemark
           completion(answer: displayLocaitonInfo(pm))
        else 
           println("Problems with the data received from geocoder.")
           completion(answer: "")
       
   )


【讨论】:

感谢所有帮助。我对如何调用该函数感到困惑。我查看了一些网站(thatthinginswift.com/completion-handlers 似乎是最适合初学者的网站),但我仍然不知道如何添加额外的完成参数。 到目前为止我解决这个问题的壁橱是:'getPlaceName(Double(latitude), Double(longitude), (answer) -> Void in println(answer) ) ' 想通了!谢谢你的帮助,ad121。 没问题...很高兴你明白了。

以上是关于Swift 中的 CLGeocoder - 使用 reverseGeocodeLocation 时无法返回字符串的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 CLGeocoder 快速获取正确的城市名称

Swift 中的 CLPlacemark 崩溃

通过 CLGeocoder 的方法查找一个区域中的所有位置

对许多地址进行地理编码 - CLGeocoder

CLGeocoder 延迟直到完成处理程序

如何从 CLGeocoder geocodeAddressString() 中的完成处理程序更新列表中的地址