2016-09-22 4 views
3

私はこれらの構文ステートメントのどれが(もっと)正しいかどうか不思議です。 プレイグラウンドは、両方のケースを楽しくコンパイルします。最後の引数が記載する前に2番目の方法で丸められたブラケットが閉じているなぜさまざまなタイプのクロージャ構文がスウィフトで - どれが正しいですか?

方法1

// copied from SO and this appears clear to me 
UIView.animate(
    withDuration: 3.0, 
    animations: { 

    }, 
    completion: { (Bool) in 
     // completion code 
    } 
) 

方法2

UIView.animate(
    withDuration: 3.0, 
    animations: { 

     // code 

    }) {(Bool) in 
     // code when finished? 
     // argument label completion missing? 
    } 

?または、UIView.animationの別の実装ですか?

答えて

4

両方の方法の差は以下の通りである

方法1:レギュラー閉鎖

方法2:閉鎖末尾。 最後の関数のシグネチャ内のクロージャパラメータは、という短い構文に書き込むことができます。 2番目のパラメータがcompletionで、animationsのパラメータが最後の場合、後続のクロージャはアニメーションなどに適用されます。 したがって、最後の(または唯一の)クロージャパラメータとして立つ必要があります。

あなたがcompletionラベルを逃した場合、あなたはこのようにそれを入力して自由である:同様にあなたの質問を完了するために

UIView.animate(withDuration: 3.0, animations: { 

}) {(completion: Bool) in 

} 

:それは同一の機能の同じ実装ですが、異なる構文

+1

から末尾の閉鎖についての詳細を読むことができますがそれを言うつもりだったが、あなたはうまくそれを述べました。後続のクロージャを使用する利点は、しばしばよりクリーンなコードを生成することです。 – picciano

+0

もう一度見たあと、きれいに見えてきました:)ありがとう。 – GiorgioE

6

どちらも正しいです。

  1. これは、関数呼び出しの通常のクロージャ構文です。

  2. 末尾封鎖を表します。

あなたは 関数の最後の引数と閉鎖式が長くなるよう関数にクロージャ式を渡す必要がある場合は、 代わりに、末尾のクロージャとしてそれを書くのに役立ちます。末尾の クロージャは、関数コールの括弧の後に書かれていますが、 でも関数の引数です。末尾の クロージャ構文を使用する場合は、クロージャの引数ラベルを 関数呼び出しの一部として書き込まないでください。

あなたはhttps://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

+1

ありがとうございますので、argを書いてはいけません。トレーリングクロージャ内のラベル?それとも必要ないのですか? – GiorgioE

+2

引数のラベルを末尾のクロージャで書き込むスコープはありません。 「完了:」を書く必要はない。末尾のクロージャの本体は、ブラケットを呼び出すメソッドの外に書き込まれます。つまり、UIView.animate(...){末尾のクロージャーボディ} – PGDev

関連する問題