CLLocationManager — фатальная ошибка: неожиданно найдено nil при распаковке необязательного значения

У меня небольшая проблема с CLLocationManager. Когда я нажимаю на IBAction "addPlace", происходит сбой приложения. Я не вижу проблемы, и я не понимаю, почему приложение вылетает.

Заранее благодарю за ответ.

class Map: UIViewController, CLLocationManagerDelegate {

    // Outlets

    @IBOutlet weak var mapView: MKMapView!
    @IBOutlet weak var BTNAdd: UIButton!

    // Variables

    var positionManager = CLLocationManager()
    var geoCoder : CLGeocoder!
    var placemark : CLPlacemark!

    var name: String = ""
    var address: String = ""
    var longitude: String = ""
    var latitude: String = ""

    // Actions

    @IBAction func myPosition(sender: AnyObject) {

        positionManager.delegate = self
        positionManager.desiredAccuracy = kCLLocationAccuracyBest
        positionManager.requestWhenInUseAuthorization()
        positionManager.startUpdatingLocation()

        mapView.showsUserLocation = true

    }

    @IBAction func addPlace(sender: AnyObject) {

            ///////////////////////////////////////
            // BUG HERE
            ///////////////////////////////////////

            let locality = String(self.placemark.locality)
            let postalCode = String(self.placemark.postalCode)
            let administrativeArea = String(self.placemark.administrativeArea)
            let country = String(self.placemark.country)

            print(locality + postalCode + administrativeArea + country)

            ///////////////////////////////////////
            ///////////////////////////////////////

    }

    // Functions

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

        CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in

            if let pm = placemarks?.first {
                self.displayLocationInfo(pm)
            }
        })

    }

    func displayLocationInfo(placemark: CLPlacemark?) {
        if let containsPlacemark = placemark {

            positionManager.stopUpdatingLocation()

            let locality = (containsPlacemark.locality != nil) ? containsPlacemark.locality : ""
            let postalCode = (containsPlacemark.postalCode != nil) ? containsPlacemark.postalCode : ""
            let administrativeArea = (containsPlacemark.administrativeArea != nil) ? containsPlacemark.administrativeArea : ""
            let country = (containsPlacemark.country != nil) ? containsPlacemark.country : ""

        }

    }

}

person Kevin Py    schedule 24.09.2015    source источник


Ответы (2)


Ваша переменная placemark объявлена ​​как явно развернутая необязательная, но поскольку вы получаете это сообщение об ошибке, очевидно, что иногда эта переменная будет нулевой.

Измените объявление, чтобы сделать его обычным необязательным, затем используйте if let, чтобы обеспечить безопасную распаковку и обработку ошибок:

var placemark : CLPlacemark?

@IBAction func addPlace(sender: AnyObject) {

        if let mark = placemark {
            let locality = String(self.mark.locality)
            let postalCode = String(self.mark.postalCode)
            let administrativeArea = String(self.mark.administrativeArea)
            let country = String(self.mark.country)
            print(locality + postalCode + administrativeArea + country)
        } else {
            print("placemark was nil")
        }

}
person Eric Aya    schedule 24.09.2015
comment
Спасибо за ваш ответ, но у меня есть ошибка в метке: ссылка на свойство "метка" в закрытии требует "я". сделать семантику захвата явной. Если я добавлю self.placemark и удалю других, ошибок не будет, а будет отображаться только «метка была нулевой». - person Kevin Py; 24.09.2015
comment
Пожалуйста. И это было целью: обработать ошибку, чтобы предотвратить сбой вашего приложения. :) Если вы видите, что метка строки была нулевой, это потому, что метка была нулевой. Он отвечает на ваш вопрос: я не вижу проблемы и не понимаю, почему происходит сбой приложения. Теперь вы видите и понимаете: явно развернутый необязательный параметр, который был нулевым. - person Eric Aya; 24.09.2015

Я добавляю переменные в класс и исправляю свой IBAction

var locality: String = ""
var postalCode: String = ""
var administrativeArea: String = ""
var country: String = ""

@IBAction func addPlace(sender: AnyObject) {

    let locality = self.locality
    let postalCode = self.postalCode
    let administrativeArea = self.administrativeArea
    let country = self.country

    print(locality + postalCode + administrativeArea + country)

}
person Kevin Py    schedule 24.09.2015