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:
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.