一尘不染

Swift:Corelocation处理didFailWithError中的NSError

swift

我正在使用CoreLocation成功确定用户的位置。但是,当我尝试使用CLLocationManagerDelegate方法时:

func locationManager(_ manager: CLLocationManager!, didFailWithError error: NSError!)

我遇到了错误术语的问题。

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    println("didFailWithError \(error)")

    if let err = error {
        if err.code == kCLErrorLocationUnknown {
            return
        }
    }
}

这将导致出现“使用未解决的标识符kCLErrorLocationUnknown”错误消息。我知道kCLErrors是枚举,并且它们已经在Swift中发展了,但我陷入了困境。


阅读 295

收藏
2020-07-07

共1个答案

一尘不染

Swift 4更新: 错误现在传递给回调error: Error,可以将其转换为CLError

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    if let clErr = error as? CLError {
        switch clErr {
        case CLError.locationUnknown:
            print("location unknown")
        case CLError.denied:
            print("denied")
        default:
            print("other Core Location error")
        }
    } else {
        print("other error:", error.localizedDescription)
    }
}

较旧的答案: 核心位置错误代码定义为

enum CLError : Int {
    case LocationUnknown // location is currently unknown, but CL will keep trying
    case Denied // Access to location or ranging has been denied by the user
    // ...
}

并将枚举值与整数进行比较err.codetoRaw() 可以使用:

if err.code == CLError.LocationUnknown.toRaw() { ...

或者,您可以CLError根据错误代码创建一个,然后检查是否有可能的值:

if let clErr = CLError.fromRaw(err.code) {
    switch clErr {
    case .LocationUnknown:
        println("location unknown")
    case .Denied:
        println("denied")
    default:
        println("unknown Core Location error")
    }
} else {
    println("other error")
}

更新: 在Xcode 6.1 beta
2中,fromRaw()toRaw()方法分别被init?(rawValue:)初始化器和rawValue属性代替:

if err.code == CLError.LocationUnknown.rawValue { ... }

if let clErr = CLError(rawValue: code) { ... }
2020-07-07