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

时间:2017-11-12 01:19:49

标签: ios swift xcode google-maps

我在SO上看到的问题很少,但在Swift 2中它们都很老了。 我从Apple网站获得此功能,将城市名称转换为纬度和经度,但我不确定该函数将返回什么(因为返回语句后没有任何内容),我应该通过什么。有人会解释它或者告诉我如何使用它。

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 个答案:

答案 0 :(得分:3)

您可以按照以下方式执行此操作:

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 :(得分: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,您可以使用函数而不是返回结果或错误。