Swift: Corelocation обрабатывает NSError в didFailWithError
Я использую 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, но я застрял.
3 ответа
Обновление для 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.code
, toRaw()
может быть использован:
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) { ... }
В Swift 3 это сейчас:
if error._code == CLError.denied.rawValue { ... }
Swift 4.1:
func locationManager(_: CLLocationManager, didFailWithError error: Error) {
let err = CLError.Code(rawValue: (error as NSError).code)!
switch err {
case .locationUnknown:
break
default:
print(err)
}
}