私はSwift2でエラー処理モデリングを使用しようとします。
do {
try NSFileManager.defaultManager().removeItemAtPath("path")
} catch {
// ...
} finally {
// compiler error.
}
しかし、そこにはfinally
キーワードがないようです。どうすればtry-catch-finally pattern
Swiftで。どんな助けでも大歓迎です。
Swift 2.0のエラー処理を例外と同じものだと考えている場合は、誤解されています。
これは例外ではありません。これはErrorType
というプロトコルに準拠したエラーです。
ブロックの目的は、スローする関数またはメソッドによってスローされたエラーをインターセプトすることです。
基本的にfinally
はありません。実行できることは、コードをdefer
ブロックにラップすることです。これは、実行が保証され、スコープの終わりです。
ここにSwift 2 プログラミングガイド のサンプルがあります
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.
}
}
コード実行が現在のコードブロックを離れる直前に、deferステートメントを使用して一連のステートメントを実行します。これにより、エラーが発生したかどうかに関係なく、必要なクリーンアップを実行できます。たとえば、開いているファイル記述子を閉じたり、手動で割り当てられたメモリを解放したりします。
defer in Swift 2.0は、finallyのようなものです。つまり、Swiftは、現在の関数の最後で遅延コードを実行することを保証しますスコープ。ここに私が知っておくべきいくつかのポイントがあります:1)ガードでさえ戻っても2)複数の据え置きスコープを書くことができます
次に、複数の据え置きを示す例と出力を示します。
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
探しているのはdefer
です。これは、実行が現在のスコープを離れようとするまで実行されないコードブロックを定義しますが、常に実行されます。
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.
}
}
defer
の詳細については、 Apple Swiftのドキュメント、特に「クリーンアップアクションの指定」セクション を参照してください。
これを読んでください: Swift 2:のdeferキーワード:try/finally done right
例えば :
print("Step 1")
do {
defer { print("Step 2") }
print("Step 3")
print("Step 4")
}
print("Step 5")
出力:
Step 1
Step 3
Step 4
Step 2
Step 5