2015-06-22 12 views
12

Provo ad utilizzare la gestione degli errori di modellazione in Swift2.Qual è l'equivalente di finalmente in Swift

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

ma sembra che non ci sia finally parola chiave out there.How posso raggiungere try-catch-finally pattern in Swift.Any aiuto è benvenuto.

+0

è ** differimento ** - una delle cose più importanti in tutto Swift – Fattie

risposta

15

Se stai pensando di SWIFT Gestione degli errori 2.0 per essere la stessa cosa come eccezione sei incomprensione.
Questa non è un'eccezione, si tratta di un errore conforme a un protocollo chiamato ErrorType.
Lo scopo del blocco è intercettare l'errore generato da una funzione o metodo di lancio.
In pratica non esiste lo finally, quello che puoi fare è racchiudere il codice in un blocco defer, questo è garantito per essere eseguito e alla fine dell'ambito.
Ecco un campione da 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. 
    } 
} 

si utilizza un'istruzione rinviare per eseguire una serie di istruzioni poco prima l'esecuzione di codice lascia il blocco corrente di codice. Ciò ti consente di eseguire una pulizia necessaria di da eseguire indipendentemente dal fatto che si sia verificato un errore . Gli esempi includono la chiusura di eventuali descrittori di file aperti e che libera qualsiasi memoria allocata manualmente.

2

Quello che stai cercando si chiama defer. Definisce un blocco di codice che non viene eseguito fino a quando l'esecuzione non sta per lasciare l'ambito corrente, ma viene sempre eseguita.

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. 
    } 
} 

Per maggiori dettagli su defer uno sguardo al Apple Swift documentation, especially section "Specifying Clean-up Actions".

1

Swift 2 introduce la propria opinione su questo requisito utilizzando la parola chiave defer

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

finally = defer a Swift 2.

articolo per defer parola chiave

+0

"finally = defer" - Non esattamente. In un try/catch/finalmente in linguaggi come C# o Java, il blocco finally verrà eseguito indipendentemente dal fatto che ci sia un'eccezione. Questo comportamento offre il vantaggio di poter inserire il codice in un blocco finale che verrà eseguito indipendentemente da cosa. In swift, il rinvio viene eseguito solo dopo l'ambito corrente e un blocco catch si troverà in un ambito diverso. Quindi non è esattamente la stessa cosa di "finalmente". – dcp

6

rinviare in Swift 2.0 è come un infine, che significa rapido si assicura eseguire tale codice rinviare alla fine della portata funzione corrente. Ecco i alcuni punti che ho bisogno di sapere: 1) Non importa nemmeno guardia torna 2) si può scrivere più ambiti Posticipa

Ecco l'esempio e di uscita che dimostra più differisce:

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 
Problemi correlati