web-dev-qa-db-fra.com

Quel est l'équivalent de finalement dans Swift

J'essaie d'utiliser la modélisation de gestion des erreurs dans Swift2.

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

Mais il semble qu’il n’y ait pas de mot clé finally.Comment puis-je obtenir un try-catch-finally pattern dans Swift.Toute aide est la bienvenue.

15
tounaobun

Si vous pensez que la gestion des erreurs de Swift 2.0 est identique à une exception, vous vous trompez. 
Ce n’est pas une exception, c’est une erreur conforme à un protocole appelé ErrorType
Le but du bloc est d’intercepter l’erreur générée par une fonction ou une méthode de projection.
Fondamentalement, il n’ya pas de finally, vous pouvez envelopper votre code dans un bloc defer, ceci est garanti pour être exécuté et la fin de la portée.
Voici un échantillon de Swift 2 guide de programmation

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

Vous utilisez une instruction de report pour exécuter un ensemble d'instructions juste avant que l'exécution du code Ne quitte le bloc de code actuel. Cela vous permet d'effectuer tout nettoyage Nécessaire qui doit être effectué indépendamment du fait qu'une erreur Soit survenue ou non. Les exemples incluent la fermeture de tout descripteur de fichier ouvert et la libération de toute mémoire allouée manuellement .

18
Andrea

defer dans Swift 2.0, c’est comme finalement, cela signifie que Swift vous assure d’exécuter ce code de report à la fin de la portée de la fonction en cours. Voici quelques points que j'ai besoin de savoir: 1) Peu importe, même la garde reviendra 2) nous pouvons écrire plusieurs portées de report

Voici l'exemple et la sortie qui montre plusieurs différés:

    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
9
Narendra G

Ce que vous recherchez s'appelle defer. Il définit un bloc de code qui n'est pas exécuté jusqu'à ce que l'exécution soit sur le point de quitter l'étendue actuelle, mais il est toujours exécuté.

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

Pour plus de détails sur defer, consultez la documentation Apple Swift, en particulier la section "Spécification des actions de nettoyage" .

3
miho

Swift 2 introduit sa propre interprétation de cette exigence en utilisant le mot-clé -defer

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

finally = defer in Swift 2.

Article pour différer mot clé

2
Ashish Kakkad

lisez ceci: Le mot clé différé dans Swift 2: essayer/enfin bien fait

par exemple : 

print("Step 1")

do {
    defer { print("Step 2") }
    print("Step 3")
    print("Step 4")
}

print("Step 5")

Sortie: 1, 3, 4, 2, 5

0
Arash Jamshidi