Как работает ошибка в Swift в Xcode 8 beta 4

Кажется, что при преобразовании нашего старого кода в бета-версию 4 я продолжаю отличать ошибку от NSError. Иногда это может привести к предупреждению, что "условный перевод с" Ошибка "на" NSError "всегда преуспевает". Я чувствую, что не понимаю, как лучше использовать Error. Я хочу, чтобы подумать, как error.code, error.localizedDescription... Есть ли хорошая документация или учебники, объясняющие эти ошибки?

Например:

func webView(_ webView: UIWebView, didFailLoadWithError error: Error) { 

Сейчас я делаю что-то вроде:

if let error = error as? NSError {
 if error.code == NSURLErrorCancelled {

Но это дает предупреждение "Условный перевод с" Ошибка "на" NSError "всегда преуспевает"

Ответы

Ответ 1

Ошибка соединяется с NSError таким же образом, что String является мостом для NSString. I.e(ошибка как NSError) будет работать.

if  (error as NSError).code == NSURLErrorCancelled { 
    // code
}

Ответ 2

Сделайте это:

Swift 3.0 и Swift 4.0

if error._code == NSURLErrorCancelled { }

Ответ 3

Ошибка захвата в Swift 3 изменилась. Найдите NSError в Примечания к выпуску. Цитата:

Кроме того, типы ошибок, импортированные из Cocoa и Cocoa Touch, сохраняют всю информацию в соответствующем NSError, поэтому больше не нужно catch let as NSError извлекать (например) словарь пользовательской информации, Конкретные типы ошибок также содержат типизированные аксессоры для их общих ключей пользовательской информации. Например:

do {
    let regex = try NSRegularExpression(pattern: "(", options: [])
} catch {
    // error is of type NSError already
    print(error.localizedDescription)
}