无时获得迅速坐标(Nil when obtain coordinates in swift)

2019-11-03 10:27发布

我想弃权从设备坐标,但应用程序崩溃。 任何人都知道到底发生了什么? 我想,当问权限,但该请求被拒绝,也许创造一个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

        }

}
}

Answer 1:

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方法。



文章来源: Nil when obtain coordinates in swift