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