2015-06-22 10 views
12

Ich versuche, die Fehlerbehandlung Modellierung in Swift2 zu verwenden.Was ist das Äquivalent von schließlich in Swift

do { 
    try NSFileManager.defaultManager().removeItemAtPath("path") 
} catch { 
    // ... 
} finally { 
    // compiler error. 
} 

Aber es scheint, dass es keine finally Schlüsselwort aus there.How kann ich try-catch-finally pattern in Swift.Any Hilfe erreichen ist willkommen.

+0

es ist ** Defer ** - eines der wichtigsten Dinge in allen Swift – Fattie

Antwort

15

Wenn Sie über die SWIFT denken 2.0 Fehlerbehandlung ist die gleiche Sache wie Ausnahme, die Sie missverstehen.
Dies ist keine Ausnahme, dies ist ein Fehler, der einem Protokoll namens ErrorType entspricht.
Der Zweck des Blocks besteht darin, den von einer Wurffunktion oder -methode geworfenen Fehler abzufangen.
Grundsätzlich gibt es keine finally, was Sie tun können, ist Ihren Code in einen defer Block zu wickeln, dies wird garantiert ausgeführt werden und das Ende des Bereichs.
Hier eine Probe von SWIFT 2 programming guide

func processFile(filename: String) throws { 
    if exists(filename) { 
     let file = open(filename) 
     defer { 
      close(file) 
     } 
     while let line = try file.readline() { 
      /* Work with the file. */ 
     } 
     // close(file) is called here, at the end of the scope. 
    } 
} 

Sie verwenden eine Zurückstellungs Anweisung eine Reihe von Anweisungen verlässt den aktuellen Codeblock kurz vor Ausführung von Code auszuführen. Auf diese Weise können Sie eine erforderliche Bereinigung durchführen, die unabhängig davon ausgeführt werden sollte, ob ein Fehler aufgetreten ist. Beispiele schließen das Schließen beliebiger geöffneter Dateideskriptoren und Freigeben von manuell zugewiesenem Speicher ein.

2

Was Sie suchen, heißt defer. Es definiert einen Codeblock, der erst ausgeführt wird, wenn die Ausführung gerade den aktuellen Bereich verlässt, aber immer ausgeführt wird.

func processFile(filename: String) throws { 
    if exists(filename) { 
     let file = open(filename) 
     defer { 
      close(file) 
     } 
     while let line = try file.readline() { 
      /* Work with the file. */ 
     } 
     // close(file) is called here, at the end of the scope. 
    } 
} 

Weitere Einzelheiten zu defer haben einen Blick auf die Apple Swift documentation, especially section "Specifying Clean-up Actions".

1

Swift 2 stellt seine eigene Version auf diese Anforderung mit dem defer Stichwort

defer { 
    print("Do clean up here") 
} 

finally = defer in Swift 2.

Artikel für defer Stichwort

+0

"finally = defer" - Nicht genau. Bei einem try/catch/finally in Sprachen wie C# oder Java wird der finally-Block unabhängig davon ausgeführt, ob eine Ausnahme vorliegt. Dieses Verhalten bietet den Vorteil, dass es möglich ist, Code in einen finally-Block zu schreiben, der ausgeführt wird, egal was passiert. In swift wird defer nur nach dem aktuellen Bereich ausgeführt, und ein catch-Block würde sich in einem anderen Bereich befinden. Es ist also nicht dasselbe wie "endlich". – dcp

6

defer in Swift 2.0 ist wie ein endlich, das heißt, Sie zügig gewährleistet am Ende der aktuellen Funktionsumfang dieses Zurückstellungs Code auszuführen. Hier sind die einige Punkte, die ich wissen müssen: 1) Egal selbst Wache wird zurückkehrt 2) wir können mehrere defer Tive schreiben

Hier ist das Beispiel und die Ausgabe, die mehrere aufschiebt zeigt:

func myMethod() { 
    print("Message one") 
    print("Message two") 
    print("Message three") 
    defer { 
     print("defered block 3") 
    } 
    defer { 
     print("defered block 2") 
    } 
    defer { 
     print("defered block 1") 
    } 
    print("Message four") 
    print("Message five") 

} 
Output: 
Message one 
Message two 
Message three 
Message four 
Message five 
defered block 1 
defered block 2 
defered block 3