在Swift中将城市名称转换为坐标

4

我在SO上看到了一些问题,但所有的问题都是Swift 2时代的。 我从苹果网站得到了这个函数,可以将城市名称转换为纬度和经度,但我不确定该函数会返回什么(因为return语句后面没有内容),以及我应该传递什么参数。能否有人解释一下或者向我展示如何使用它?

func getCoordinate( addressString : String, 
        completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void ) {
    let geocoder = CLGeocoder()
    geocoder.geocodeAddressString(addressString) { (placemarks, error) in
        if error == nil {
            if let placemark = placemarks?[0] {
                let location = placemark.location!

                completionHandler(location.coordinate, nil)
                return
            }
        }

        completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?)
    }
}
2个回答

7
您可以按照以下步骤进行操作:
import CoreLocation

func getCoordinateFrom(address: String, completion: @escaping(_ coordinate: CLLocationCoordinate2D?, _ error: Error?) -> () ) {
    CLGeocoder().geocodeAddressString(address) { completion($0?.first?.location?.coordinate, $1) }
}

使用方法:

let address = "Rio de Janeiro, Brazil"

getCoordinateFrom(address: address) { coordinate, error in
    guard let coordinate = coordinate, error == nil else { return }
    // don't forget to update the UI from the main thread
    DispatchQueue.main.async {
        print(address, "Location:", coordinate) // Rio de Janeiro, Brazil Location: CLLocationCoordinate2D(latitude: -22.9108638, longitude: -43.2045436)
    }

}

1

进行异步操作,例如获取城市的坐标,无法将结果作为函数返回值返回。您必须发起调用,继续处理其他事务,并等待它调用您的完成处理程序。这就是上面代码中参数completionHandler的作用。您传递一个闭包(一段代码块),以在结果准备就绪时执行。您可以像这样使用它:

getCoordinate(addressString: someString) { coordinate, error in
  if error != nil {
    //display error
    return
  } else {
    //at this point `coordinate ` contains a valid coordinate. 
    //Put your code to do something with it here
    print("resulting coordinate = (\(coordinate.latitude),\(coordinate.longitude))")
  }
}

请注意,对于Swift 3,您需要使您的函数抛出错误而不是返回结果或错误。

我非常感激你所做的一切,但如果我只想传递一个城市名称以获取位置,因为我不确定如何将其用于传递代码块,那该怎么办呢?你能否向我展示我需要使用的确切代码,我会非常感激。 - codeDojo
你写的那段代码,我不确定它是用来解释还是真正的函数,我试着把它放进我的代码里,结果出现了很多错误。 - codeDojo
这里的主要问题只是缺少一个闭合括号,这就解释了为什么 OP 会遇到许多错误。另外,将 CLLocationCoordinate2D 命名为 location 是有误导性的,而且你也忘记提到当调用异步方法时,OP 需要回到主线程来更新用户界面。 - Leo Dabus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接