繁体   English   中英

iOS-如何返回经度和纬度?

[英]iOS - How can I return latitude and longitude?

我无法返回经纬度。 我总是得到0.0和0.0。

我该怎么做才能获得这些价值?

代码:

func forwardGeocoding (address: String) -> (Double, Double) {
let geoCoder = CLGeocoder()

var latitude: Double = 0.0
var longitude: Double = 0.0

geoCoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in

    if error != nil {
        print(error?.localizedDescription)
    } else {
        if placemarks!.count > 0 {
            let placemark = placemarks![0] as CLPlacemark
            let location = placemark.location

            latitude = Double((location?.coordinate.latitude)!)
            longitude = Double((location?.coordinate.longitude)!)

            print("before : \(latitude, longitude)")

        }
    }
}

print("after : \(latitude, longitude)")
return (latitude, longitude)
}

这是我的viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
  forwardGeocoding("New York, NY, United States")

}

结果:

之后:(0.0,0.0)

之前:(40.713054,-74.007228)

很明显,您的函数始终返回(0.0,0.0)。 这是因为geoCoder.geocodeAddressString()异步返回地标。 这是一项耗时的操作,因此您必须修改代码以进行处理。

一种可能的解决方案是修改您的功能:

func forwardGeocoding (address: String, completion: (Bool, CLLocationCoordinate2D!) -> () ) {
    let geoCoder = CLGeocoder()

    geoCoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in

        if error != nil {
             print(error?.localizedDescription)
             completion(false,nil)
        } else {
             if placemarks!.count > 0 {
             let placemark = placemarks![0] as CLPlacemark
             let location = placemark.location

             completion(true, location?.coordinate)

        }
    }
}

并称之为:

self.forwardGeocoding(YourAdress, completion {
     success, coordinate in

     if success {
         let lat = coordinate.lattitude
         let long = coordinate.longitude
         // Do sth with your coordinates
     } else {

         // error sth went wrong
     }

}

请注意,您的函数未返回任何内容。 希望能有所帮助。

您的代码存在问题,因为地理编码请求是异步的,因此return语句在实际检索地理编码结果之前就已执行。

我可能会使用两个选项之一来解决此问题。 首先,不要返回元组,而是创建自己的完成处理程序,并在找到地标后调用它:

func forwardGeocoding (address: String, completion: (CLLocationCoordinate2D) -> Void) {
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in

        if error != nil {
            print(error?.localizedDescription)
        } else {
            if placemarks!.count > 0 {
                let placemark = placemarks![0] as CLPlacemark
                let location = placemark.location
                completion(location.coordinate)
            }
        }
    }
}

现在,当您调用此函数时,无论您在何处调用该函数,都可以为它提供相关值的补全。

如果该函数实际上是一个类中的方法,并且永远不需要从另一个类中调用它,则可以让它设置该类的属性,而这些属性可以具有didSet块。 例如:

class SomeClass {
    var coordinates: CLLocationCoordinate2D {
        didSet {
            doSomethingWithCoordinates()
        }
    }

    private func forwardGeocoding (address: String, completion: (CLLocationCoordinate2D) -> Void) {
        let geoCoder = CLGeocoder()
        geoCoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in

            if error != nil {
                print(error?.localizedDescription)
            } else {
                if placemarks!.count > 0 {
                    let placemark = placemarks![0] as CLPlacemark
                    let location = placemark.location
                    self.coordinates = location.coordinate
                }
            }
        }
    }
}

第一个选项可能更具通用性,但是第二个选项避免将完成块与完成块一起使用,这有时会使在代码中进行跟踪变得混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM