Получить ошибку "неожиданно найденный ноль при развертывании необязательного значения"
Я использую google place api и использую координаты, чтобы разместить аннотацию на картах яблок.
Теперь я хочу перевести координаты в имя и адрес и использовать его для Ekreminder. Это мой код, но я получаю сообщение об ошибке "Неустранимая ошибка: неожиданно обнаружил ноль при развертывании необязательного значения" при попытке запустить его:
addLocationReminderViewController.name = self.mapItemData.placemark.name
// Construct the address
let dic = self.mapItemData.placemark.addressDictionary as Dictionary!
let city = dic["City"] as! String
let state = dic["State"] as! String
let country = dic["Country"] as! String
addLocationReminderViewController.address = "\(city), \(state), \(country)"
}
отредактируйте вот как я получаю информацию:
if data != nil{
let dic = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableLeaves) as! NSDictionary
let lat = dic["results"]?.valueForKey("geometry")?.valueForKey("location")?.valueForKey("lat")?.objectAtIndex(0) as! Double
let lon = dic["results"]?.valueForKey("geometry")?.valueForKey("location")?.valueForKey("lng")?.objectAtIndex(0) as! Double
let point = MKPointAnnotation()
point.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)
point.title = self.resultsArray[indexPath.row]
let region = MKCoordinateRegion(center: point.coordinate, span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1))
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.mapView.setRegion(region, animated: true)
self.mapView.addAnnotation(point)
self.mapView.selectAnnotation(point, animated: true)
//
let placemark = MKPlacemark(coordinate: point.coordinate, addressDictionary: nil)
let mapItem = MKMapItem(placemark: placemark)
self.mapItemData = mapItem
//
})
1 ответ
Вы "вслепую" подбираете словарные ссылки для "Город", "Штат" и "Страна" в String
с помощью as!
, Если какой-либо из них не существует в словаре или не является строкой, вы получите фатальную ошибку.
Как вы планируете обращаться с неправильно сформированным словарем? Вы могли бы использовать
if let city = dic["City"] as? String,
let state = dic["State"] as? String,
let country = dic["Country"] as? String {
// you now have your values
addLocationReminderViewController.address = "\(city), \(state), \(country)"
}
else {
// something is wrong
}