Swift: Corelocation que maneja NSError en didFailWithError
ios8 (2)
Estoy usando CoreLocation para determinar con éxito la ubicación del usuario. Sin embargo, cuando intento utilizar el método CLLocationManagerDelegate:
func locationManager(_ manager: CLLocationManager!, didFailWithError error: NSError!)
Me encuentro con problemas con el término de error.
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("didFailWithError /(error)")
if let err = error {
if err.code == kCLErrorLocationUnknown {
return
}
}
}
Esto da como resultado un mensaje de error "Uso del identificador no resuelto kCLErrorLocationUnknown". Sé que los kCLErrors son enumeraciones y que han evolucionado en Swift pero estoy estancado.
Los códigos de error de la ubicación central se definen como
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
// ...
}
y para comparar el valor de enumeración con el entero err.code
, toRaw()
se puede usar:
if err.code == CLError.LocationUnknown.toRaw() { ...
Alternativamente, puede crear un CLError
partir del código de error y verificar que para los valores posibles:
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")
}
ACTUALIZACIÓN: En Xcode 6.1 beta 2, los fromRaw()
y toRaw()
han sido reemplazados por un init?(rawValue:)
y una propiedad rawValue
, respectivamente:
if err.code == CLError.LocationUnknown.rawValue { ... }
if let clErr = CLError(rawValue: code) { ... }
En Swift 3 es ahora:
if error._code == CLError.denied.rawValue { ... }