web-dev-qa-db-ja.com

最終的にSwiftに相当するものは何ですか

私はSwift2でエラー処理モデリングを使用しようとします。

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

しかし、そこにはfinallyキーワードがないようです。どうすればtry-catch-finally pattern Swiftで。どんな助けでも大歓迎です。

23
tounaobun

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ステートメントを使用して一連のステートメントを実行します。これにより、エラーが発生したかどうかに関係なく、必要なクリーンアップを実行できます。たとえば、開いているファイル記述子を閉じたり、手動で割り当てられたメモリを解放したりします。

22
Andrea

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

探しているのは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のドキュメント、特に「クリーンアップアクションの指定」セクション を参照してください。

3
miho

Swift 2は defer キーワードを使用して、この要件に独自の見方を導入しています

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

finally = defer in Swift 2。

defer キーワードの記事

2
Ashish Kakkad

これを読んでください: 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
0
Arash Jamshidi