2015-06-14 7 views
16

Ich habe einige (hässlich) selbst geschriebenen Code zu Swift2 portiert und bekam diese Fehlermeldung in einer Lambda-Funktion:Swift 2: Ungültige Konvertierung von Funktion vom Typ Nicht-Wurf Funktion werfen

function with error

Was ich nicht verstanden habe, ist, dass ich den ganzen Code mit der Fehlerverwaltungsfunktion JSONObjectWithData behandle und den Fehler abfange. Ich werfe nichts in den Code. Trotzdem bedeutet der Compiler, dass ich einen Fehler erstelle.

Ich muss dieses Verhalten verstehen. Bitte seien Sie freundlich, weil ich weiß, dass ich meinen Code verbessern muss, um das neue Fehlerbehandlungskonzept in swift2 voll auszunutzen.

Vielen Dank im Voraus.

Antwort

36

Das war schnell. Ich habe die Lösung für mein Problem heraus mit einer wenig Hilfe dieses Artikel dacht:

http://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

Sie eine allgemeine catch-Klausel am Ende des Codes setzen, weil der Fang NSError allein nicht ausreicht.

catch let error as NSError 
{ 
    failure(error: error) 
    return 
} 

// this is important --> 
catch 
{ 
} 
+0

Warum hat Apple mit Swift 2 "Fang" erschöpfend gemacht, als wir in Swift 1/1.2 nicht einmal "versuchen" und "fangen" konnten? – rb612

+1

Sie müssen den Fehler nicht speziell abfangen. Im allgemeinen catch-Block sollte eine Fehlerreferenz verfügbar sein. –

+1

Hallo Jon, könntest du mir ein Beispiel geben, wie ich die Fehlerreferenz im allgemeinen catch block verwenden könnte ?. Danke – ChaosSpeeder

3

Ich denke, der beste Weg eine ErrorType zu nehmen ist Ihre Fehlerfunktion Signatur zu ändern. Dann einfach

catch let error { 
    failure(error: error) 
} 

wird tun.

+0

Wenn Sie die Apple API verwenden, ist es möglicherweise vorzuziehen, den Fehler auf NSError zu übertragen, da Apple-Methoden dazu neigen, ein NSError-Objekt zu werfen. Apples NSError-Objekte enthalten zusätzliche Details zu dem aufgetretenen Fehler, auf die in NSError-spezifischen Eigenschaften wie .localizedDescription und .userInfo zugegriffen wird. "JSONObjectWithData" aus dem Kommentar des ursprünglichen Posters löst ein NSError-Objekt aus. CoreData-Methoden werden auch NSError-Objekte werfen. Ich bevorzuge es, den Fehler von INSIDE im Catch-Block auf NSError zu setzen, so dass der Catch vollständig ist. – ObjectiveTC