addressDictionary returns 随机 nil

addressDictionary returns random nil

我已将 用于我的应用程序。它运行良好,但有时会在跟踪我的路线 +/- 50 秒后崩溃。我知道它与可选项“?”有关,但我无法让它工作。

我收到以下消息:

fatal error: unexpectedly found nil while unwrapping an Optional

代码中断的部分:

 if let locationName = placeMark.addressDictionary?["Name"] as? NSString
      {
         print(locationName)
         self.locationName = locationName as String
      }   

完整的 locationManager 代码:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    for location in locations as [CLLocation] {
        let howRecent = location.timestamp.timeIntervalSinceNow

        //start motion tracker
        motionTracker()

        //location name tracker
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate
        let latitude: CLLocationDegrees = locValue.latitude
        let longitude: CLLocationDegrees = locValue.longitude
        let geoCoder = CLGeocoder()
        let location = CLLocation(latitude: latitude, longitude: longitude)
        geoCoder.reverseGeocodeLocation(location)
            {
                (placemarks, error) -> Void in

                let placeArray = placemarks as [CLPlacemark]!

                // Place details
                var placeMark: CLPlacemark!
                placeMark = placeArray?[0]

                // Address dictionary
                print(placeMark.addressDictionary)

                // Location name
                if let locationName = placeMark.addressDictionary?["Name"] as? NSString
                {
                    print(locationName)
                    self.locationName = locationName as String
                }

                // Street address
                if let street = placeMark.addressDictionary?["Thoroughfare"] as? NSString
                {
                    //print(street)
                    self.locationStreet = street as String                 
                }

                // City
                if let city = placeMark.addressDictionary?["City"] as? NSString
                {
                    self.locationCity = city as String
                    //print(city)
                }

                // Zip code
                if let zip = placeMark.addressDictionary?["ZIP"] as? NSString
                {
                    //print(zip)
                }

                // Country
                if let country = placeMark.addressDictionary?["Country"] as? NSString
                {
                    //print(country)
                }
        }

我怀疑您遇到了 Google 没有您所在位置的反向地理编码结果并返回空数组的情况。

而不是:

let placeArray = placemarks as [CLPlacemark]!
var placemark: CLPlacemark!
placemark = placeArray?[0]

... 假定将有一个数组并且它总是包含至少一个元素,使用:

if let placemark = placemarks?.first {
    // Rest of your code
}