我试着运行这篇文章的答案中提供的代码(Swift - Generate an Address Format from Reverse Geocoding),从经纬度信息中获取地址信息。当我试着在Swift Playground(App Store的独立版本和Xcode 14附带的版本)中运行它时,它似乎在第一次运行时没有做任何事情。然而,在深入研究之后,似乎出现了某种糟糕的异常。
import CoreLocation
func getAddressFromLatLon(pdblLatitude: String, withLongitude pdblLongitude: String) {
var center : CLLocationCoordinate2D = CLLocationCoordinate2D()
let lat: Double = Double("\(pdblLatitude)")!
//21.228124
let lon: Double = Double("\(pdblLongitude)")!
//72.833770
let ceo: CLGeocoder = CLGeocoder()
center.latitude = lat
center.longitude = lon
let loc: CLLocation = CLLocation(latitude:center.latitude, longitude: center.longitude)
ceo.reverseGeocodeLocation(loc, completionHandler: { (placemarks, error) in
if (error != nil)
{
print("reverse geodcode fail: \(error!.localizedDescription)")
}
let pm = placemarks! as [CLPlacemark]
if pm.count > 0 {
let pm = placemarks![0]
print(pm.country)
print(pm.locality)
print(pm.subLocality)
print(pm.thoroughfare)
print(pm.postalCode)
print(pm.subThoroughfare)
var addressString : String = ""
if pm.subLocality != nil {
addressString = addressString + pm.subLocality! + ", "
}
if pm.thoroughfare != nil {
addressString = addressString + pm.thoroughfare! + ", "
}
if pm.locality != nil {
addressString = addressString + pm.locality! + ", "
}
if pm.country != nil {
addressString = addressString + pm.country! + ", "
}
if pm.postalCode != nil {
addressString = addressString + pm.postalCode! + " "
}
print(addressString)
}
})
}
getAddressFromLatLon(pdblLatitude: "42.48001070918", withLongitude: "-76.4511703657")
看着错误它说:
错误:执行被中断,原因:信号SIGABRT。进程已停留在中断点,使用“thread return -x”返回到表达式求值前的状态。
我不明白发生了什么。如果我在SwiftUI项目中使用这段代码,我也会遇到坏的异常,导致程序停止。这似乎是异步函数reverseGeocodeLocation
的问题,但我不确定为什么错误没有被捕获,尽管它应该在闭包中处理它。
我还尝试使用import MapKit
而不是import Location
。使用MapKit时,它不会出错,但代码似乎什么也没做。坐标应该显示为兰辛,NY。我在这里遗漏了什么?
1条答案
按热度按时间q3qa4bjr1#
在对代码进行了一些操作之后,我发现了错误的原因。它是任何试图创建
CLLocationCoordinate2D
示例的尝试。非常奇怪。因为你可以很容易地直接从lat
和lon
值创建CLLocation
示例,所以你可以避免这个错误。这是一个经过大量清理的代码版本。这段代码消除了所有的强制解包。下面的代码在Xcode 14.1中运行得很好。
除了所有的代码清理,它的使用
CLLocationCoordinate2D
的删除解决了主要问题。即使您在Xcode 14.1中创建了一个全新的iOSPlayground,并仅输入以下代码,Playground也会崩溃:
输出量:
之前
libc++abi:终止时出现未捕获的NSException类型异常