在Geocode调用中崩溃

在使用CLGeocoder我得到一个崩溃(EXC_BAD_ACCESS),让我在不知道的closures成功的一部分,让我的地标…后。 我正在testing,并可能试图访问服务器多次。 或者我需要在后台线程中进行调用?

import UIKit import CoreLocation class ViewController: UIViewController { var destinationPlacemark = CLPlacemark() override func viewDidLoad() { super.viewDidLoad() forwardGeocoding(address: "Infinite Loop, Cupertino, CA 95014") } func forwardGeocoding(address: String) { CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in if error != nil { print(error ?? "Error in plscement conversion") return } if (placemarks?.count)! > 0 { let placemark = placemarks?[0] let location = self.destinationPlacemark.location let coordinate = location?.coordinate print("Latitude: \(coordinate!.latitude), Longitude: \(coordinate!.longitude)") self.destinationPlacemark = placemark! } }) } } 

*更新与原因*

你在这里有很多的东西,所以我会尝试去修改我所做的修改:

首先,它为什么崩溃:

使用以下命令创builddestinationPlacemark:

 var destinationPlacemark = CLPlacemark() 

所以当这个运行:

 let location = self.destinationPlacemark.location 

它正在针对不包含位置数据的空白地标运行。 通过从guard语句中创build的检索的地标中提取位置,可以避免此问题。

接下来,工作代码:

 import UIKit import CoreLocation class ViewController: UIViewController { var destinationPlacemark: CLPlacemark? override func viewDidLoad() { super.viewDidLoad() forwardGeocoding(address: "1 Infinite Loop, Cupertino, CA 95014") } func forwardGeocoding(address: String) { CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in if error != nil { print(error ?? "Error in pla conversion") return } guard let placemark = placemarks?.first, let coordinate = placemark.location?.coordinate else { return } print("Latitude: \(coordinate.latitude), Longitude: \(coordinate.longitude)") self.destinationPlacemark = placemark }) } } 

其中产生:

 Latitude: 37.3316941, Longitude: -122.030127 
  1. 您没有正确设置destinationPlacemark的variables,请参阅上面的正确设置
  2. 你的苹果地址是错的,我在前面加了一个1,尽pipe你仍然有价值
  3. 你迫使太多物品,导致你看到的崩溃。 我用警卫声明取代了你的强制性演员,以防止这些演员
  4. 我在您的成功部分中删除了一些variables以简化代码