gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:21:23 28 4
gpt4 key购买 nike

我无法返回纬度和经度。我总是得到 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)

最佳答案

您的代码的问题在于地理编码请求是异步的,因此 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 block 。例如:

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
}
}
}
}
}

第一个选项可能更通用,但第二个选项避免了包含多个完成 block 的完成 block ,这有时会让人难以在代码中跟踪。

关于iOS - 如何返回纬度和经度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33463411/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com