2016-04-08 10 views
2

Objective Cブロックがクロージャーやコールバックにもっと似ているかどうか尋ねられました。しかし、コールバックの定義は、少なくともhttp://swiftspace.org/callback-function-in-swift/から借りたこの例では、閉鎖とほぼ同じようだ:プログラミング言語ガイド(スウィフト2.2)でSwiftのクロージャとコールバックの違いは何ですか?

func mainFunction(callback:() -> Void) { 

    // some code 
    callback() // call the callback function 
} 

コールバックはほとんどどここの1顕著な例外を除いて、言及されていませんクロージャの型はすでに、このような デリゲートのコールバックとして知られているとき、あなたはそのパラメータの種類、その戻り値の型、または 両方を省略することができます」

:コールバックは閉鎖のタイプのように聞こえます。 "

ヘルプ?

+1

おそらくここで答えられました:http://stackoverflow.com/questions/2070275/javascript-closures-and-callbacks – TylerH

答えて

2

これらは完全に異なる2つの互換性のある概念ですが、コールバックは、アクションが必要なときに関数を呼び出して結果や影響を与えることができるように、関数をフックするためのものです。クロージャは、ローカルスコープ外のスコープで使用されるローカル変数をキャプチャする関数です。クロージャは、他の関数と同様にコールバックにすることができますが、その用途に限定されません。

あなたの引用文では、コールバックのクロージャを使用する方法について説明しています。その場合、コンパイラは、関数のシグネチャ(パラメータの型と戻り値)をコンテキストから推測することができます。

これはObjective-Cブロックとほとんど関係がないことに注意してください。 SwiftとObjective-Cは全く異なる2つの言語であり、ブロックとクロージャは類似の概念の2つの異なる実装です。

+0

私は彼らが見ているときに2つの全く異なる概念として見ていると思いますとても似ています。したがって、基本的に違いは次のとおりです。
コールバックは関数のフックです。クロージャは関数です。 (実際には、関数は特殊な型のクロージャであり、問​​題をもっと混同することはありません)。
クロージャはローカル変数を取得できます。
クロージャはコールバックになることができますが、他のこともできます。 – squarehippo10

+0

スウィフトでは、関数は呼び出し可能な任意のコードで、場合によってはパラメータと戻り値の型があります。スコープ内に存在し、関数名を含む関数シグニチャーを持つ事前定義されたフリー関数があります。名前のないクロール関数もあり、呼び出しコンテキストからパラメータと戻り値の型を取ります。どちらが由来しているかは、実装の詳細であり、実際にはほとんどの状況に関係なくです。 – ColGraff

関連する問題