Swift: обработка коллаборации 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, но я застрял.

Ответ 1

Коды ошибок Core Location определены как

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) { ... }

Ответ 2

В Swift 3 теперь:

if error._code == CLError.denied.rawValue { ... }