2016-08-01 14 views
16

Wygląda na to, że podczas konwersji naszego starego kodu do wersji beta 4, nadal przesyłam błąd do NSError. To czasami doprowadzi nawet do ostrzeżenia "warunkowa obsada od" Błąd "do" NSError "zawsze się udaje". Czuję, że nie rozumiem, jak najlepiej używać błędu. Chcę dostać się do myśli takich jak error.code, error.localizedDescription ... Czy istnieje dobra dokumentacja lub samouczki wyjaśniające te zmiany błędów?Jak działa błąd w Swift w Xcode 8 beta 4

Na przykład:

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

właśnie teraz robię coś takiego:

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

ale daje ostrzeżenie "warunkowego odlana z 'Błąd' do 'NSError' zawsze udaje"

+0

Błąd jest do pokonania na NSError w taki sam sposób, że ciąg jest do pokonania do NSString. Np. (Błąd jako NSError) zadziałałby. – DerrickHo328

+0

Czy mógłbyś zaznaczyć odpowiedź jako poprawną, jeśli w końcu ci to pomoże? – DerrickHo328

+0

Nie sądzę, że te odpowiedzi są poprawne, i myślę, że jest to problem związany z wersją beta 4. –

Odpowiedz

4

Błąd przechwytywania w Swift 3 uległ zmianie. Wyszukaj NSError w Release Notes. Cytat:

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

Jak mam sobie z tym poradzić? func Webview (_ Webview: error UIWebView, didFailLoadWithError: Error) { Teraz robię coś takiego jeśli niech Error = Błąd co? NSError { if error.code == NSURLErrorCancelled { Ale to daje ostrzeżenie "Odlewania warunkowego od" Błąd "do" NSError "zawsze się udaje" –

+1

Nie jestem pewien, czy to jest dokładne. 'error.code' nadal nie jest dostępny, a kliknięcie altem' error' pokazuje, że nadal jest wnioskowane, że jest typu "Error". –

+0

@Jason, z którym masz problem, używa "error as? NSError' zamiast 'error as NSError'. Błąd zawsze można przesłać do NSError, więc nie trzeba używać rzutowania warunkowego (tj. 'Jak?'), Ponieważ zawsze się powiedzie (co dokładnie informuje o tym błąd). –

20

Błąd jest do pokonania na NSError w taki sam sposób, że ciąg jest do pokonania do NSString. Np. (Błąd jako NSError) zadziałałby.

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

FYI: właśnie próbowałem rzucić własną 'enum MyError: Error {case test}'. Wynik: 'nsError.code' wyświetla' 0', 'nsError.domain' wyświetla' MyError', 'nsError.localizedDescription' wyświetla' Operacja nie mogła zostać zakończona. (Błąd MyError 0.) ' –

16

Wykonaj:

Swift 3.0 i Swift 4,0

if error._code == NSURLErrorCancelled { } 
+5

Działa, ale ... czy to jest? –

+1

działa również w Swift 4 ... – AamirR