Swift: Exception lors de la tentative d'printing de CLLocationSpeed ​​"trouvé de manière inattendue nil lors du déballage d'une valeur facultative"

J'essaie de faire un programme super simple qui va dès maintenant imprimer la vitesse du GPS de l'iPhone. Ceci est mon code jusqu'à présent:

// // ViewController.swift // GpsSpeed // // Created by Jacob Sandum on 4/18/15. // Copyright (c) 2015 Jacob Sandum. All rights reserved. // import UIKit import CoreLocation let locationManager = CLLocationManager() class ViewController: UIViewController, CLLocationManagerDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. locationManager.delegate = self if CLLocationManager.authorizationStatus() == .NotDetermined { locationManager.requestAlwaysAuthorization() } locationManager.desiredAccuracy=kCLLocationAccuracyBest if CLLocationManager.locationServicesEnabled() { locationManager.startUpdatingLocation() } var speed: CLLocationSpeed = CLLocationSpeed() speed = locationManager.location.speed println(speed); } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

Lorsque j'essaie d'exécuter ce code, j'obtiens cette exception fatale: unexpectedly found nil while unwrapping an Optional value (lldb)

Je pense que CLLocationSpeed ​​est nul, mais je ne sais pas comment résoudre ce problème.

Ajoutez d'abord NSLocationAlwaysUsageDescription dans votre file info.plist

Ensuite, le code complet est

  import UIKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate { let locationManager = CLLocationManager() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. locationManager.delegate = self if NSSsortingng(ssortingng:UIDevice.currentDevice().systemVersion).doubleValue > 8 { locationManager.requestAlwaysAuthorization() } locationManager.desiredAccuracy=kCLLocationAccuracyBest } func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { var speed: CLLocationSpeed = CLLocationSpeed() speed = locationManager.location.speed println(speed); } func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { if status != CLAuthorizationStatus.Denied{ locationManager.startUpdatingLocation() } } } 

Exécutez-le sur le périphérique réel

Votre erreur:

  1. Ne pas get la vitesse dans ViewDidLoad il sera seulement appelé une fois. Donc, dans votre code, chaque fois que vous essayez d'get l'location avant de commencer la mise à jour.
  2. Il est préférable d'get de la vitesse lorsque la mise à jour de la position
  3. Il est préférable de commencer la mise à jour lorsque l'authentification a été modifiée