在获取swift中的坐标时为零

时间:2014-11-09 15:03:11

标签: ios swift location

我正在尝试从设备中删除坐标,但应用程序崩溃了。谁知道可能发生了什么? 我想错误发生在它请求许可但请求被拒绝时,可能会创建一个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

        }

}
}

1 个答案:

答案 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方法中。