我正在尝试从设备中删除坐标,但应用程序崩溃了。谁知道可能发生了什么? 我想错误发生在它请求许可但请求被拒绝时,可能会创建一个if语句,但是我找不到任何相关的信息。
输出:fatal error: unexpectedly found nil while unwrapping an Optional value
import UIKit
import Foundation
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
println("\(locationManager.location.coordinate.latitude), \(locationManager.location.coordinate.longitude)")
self.locationManager.requestAlwaysAuthorization() // Ask for Authorisation from the User.
// For use in foreground
self.locationManager.requestWhenInUseAuthorization()
if (CLLocationManager.locationServicesEnabled())
{
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
self.locationManager.startUpdatingLocation()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var locValue:CLLocationCoordinate2D = manager.location.coordinate
var latitudeactual:Double = 0
var longitudeactual:Double = 0
latitudeactual = locValue.latitude
longitudeactual = locValue.longitude
locationManager.stopUpdatingLocation()
if latitudeactual != 0 || longitudeactual != 0 {
latitudeactual = locValue.latitude
longitudeactual = locValue.longitude
}
}
}
答案 0 :(得分:3)
location
属性是一个隐式解包的CLLocation
可选项,很可能是nil
。您永远不应该访问隐式展开的可选项的成员,除非您知道它不是nil
。您可以使用以下内容确认nil
:
if locationManager.location != nil {
println("\(locationManager.location.coordinate.latitude), \(locationManager.location.coordinate.longitude)")
} else {
println("locationManager.location is nil")
}
或者你可以:
println("\(locationManager.location)")
但是,如果没有先查看它是否nil
,请不要尝试访问隐式展开的对象的属性。
作为一般规则,您不应期望CLLocation
属性的有效location
对象,除非启动了位置服务并且位置更新已经开始(例如您已经看过) didUpdateLocations
致电)。确定位置的过程是异步发生的,并且预计在viewDidLoad
中不可用。应该将特定于位置的逻辑放在didUpdateLocations
方法中。