2016-08-01 4 views
16

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

Например:

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

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

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

Но что дает предупреждение "Условный бросок от 'Error' в 'NSError' всегда удается"

+0

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

+0

Не могли бы вы пометить ответ как правильный, если бы он помог вам? – DerrickHo328

+0

Я не думаю, что эти ответы правильные, и я думаю, что это проблема с бета-версией. –

ответ

4

Ошибка при введении в Swift 3 изменилась. Найдите NSError в Release Notes. Цитата:

Additionally, error types imported from Cocoa and Cocoa Touch maintain all of the information in the corresponding NSError , so it is no longer necessary to catch let as NSError to extract (for example) the user-info dictionary. Specific error types also contain typed accessors for their common user-info keys. For example:

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

Как бы я справился с этим? функ WebView (_ Webview: UIWebView, didFailLoadWithError ошибка: Error) { Сейчас я делаю что-то вроде , если пусть ошибка = ошибка как? NSError { if error.code == NSURLErrorCancelled { Но это дает предупреждение «Условный перевод с« Ошибка »на« NSError »всегда преуспевает» –

+1

Я не уверен, что это точно. 'error.code' по-прежнему недоступен, а alt-click' error' покажет вам, что он все еще выведен из типа 'Error'. –

+0

@Jason проблема, с которой вы сталкиваетесь, использует 'error as? NSError' вместо 'error as NSError'. Ошибка всегда может быть отправлена ​​в NSError, поэтому вам не нужно использовать условный листинг (т. Е. 'Как?'), Потому что он всегда будет успешным (это именно то, что говорит вам об ошибке). –

20

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

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

FYI: просто попытался создать собственный 'enum MyError: Error {case test}'. Результат: 'nsError.code' печатает' 0', 'nsError.domain' печатает' MyError', 'nsError.localizedDescription' печатает' Операция не может быть выполнена. (Ошибка MyError 0.) ' –

16

ли это:

Swift 3,0 и Swift 4,0

if error._code == NSURLErrorCancelled { } 
+5

Это работает, но ... wtf это? –

+1

также работает в Swift 4 ... – AamirR

Смежные вопросы