运行reverseGeocodeLocation函数在SwiftPlay中创建异常或不返回任何内容

ni65a41a  于 2022-11-21  发布在  Swift
关注(0)|答案(1)|浏览(172)

我试着运行这篇文章的答案中提供的代码(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。我在这里遗漏了什么?

q3qa4bjr

q3qa4bjr1#

在对代码进行了一些操作之后,我发现了错误的原因。它是任何试图创建CLLocationCoordinate2D示例的尝试。非常奇怪。因为你可以很容易地直接从latlon值创建CLLocation示例,所以你可以避免这个错误。
这是一个经过大量清理的代码版本。这段代码消除了所有的强制解包。下面的代码在Xcode 14.1中运行得很好。
除了所有的代码清理,它的使用CLLocationCoordinate2D的删除解决了主要问题。

import CoreLocation

func getAddressFromLatLon(pdblLatitude: String, withLongitude pdblLongitude: String) {
    guard let lat = Double(pdblLatitude),
          let lon = Double(pdblLongitude) else { return }

    let loc = CLLocation(latitude: lat, longitude: lon)
    let ceo = CLGeocoder()

    ceo.reverseGeocodeLocation(loc, completionHandler: { (placemarks, error) in
        if let error {
            print("reverse geodcode fail: \(error)")
        } else if let placemarks, let pm = placemarks.first {
            var addressString = ""
            if let val = pm.subLocality {
                addressString += val + ", "
            }
            if let val = pm.thoroughfare {
                addressString += val + ", "
            }
            if let val = pm.locality {
                addressString += val + ", "
            }
            if let val = pm.country {
                addressString += val + ", "
            }
            if let val = pm.postalCode {
                addressString += val + " "
            }

            print(addressString)
        }
    })
}

getAddressFromLatLon(pdblLatitude: "42.48001070918", withLongitude: "-76.4511703657")

即使您在Xcode 14.1中创建了一个全新的iOSPlayground,并仅输入以下代码,Playground也会崩溃:

import CoreLocation

print("Before")
let center = CLLocationCoordinate2D()
print("After")

输出量:
之前
libc++abi:终止时出现未捕获的NSException类型异常

相关问题