2016-05-30 7 views
9

Appleがこれを言う:クロージャとファーストクラスの機能の差を速くしますか?スウィフトドキュメントで

クロージャは周り に合格し、あなたのコード内で使用可能な機能の自己完結型ブロックです。 Swiftのクロージャは、CおよびObjective-Cのブロック 、および他のプログラミング言語のラムダに似ています。

クロージャは、それらが定義されている文脈から任意の定数と 変数への参照をキャプチャして保存することができます:私はFirst-class functions

の定義だったと、彼らはまた、これを言うと思った

。これらの定数と変数を閉じると、これは として知られています。 Swiftはあなたのためのキャプチャのメモリ管理のすべてを処理します。

私はこれが閉鎖の定義であると考えていましたが、他の定義はファーストクラスの機能だと思っていましたが、Appleはそれらをまとめて閉鎖と呼んでいるようです。

私は何か誤解しましたか?またはアップルはクロージャとファーストクラスのクロージャを呼びますか?

私はこのサンプルコードを書いていますが、私が書いたコメントに正しいかどうかを知りたいのですか?

// 'a' takes a first class function, which makes 'a' a higher order function 
func a(ch:() -> Void){ 
    print("Something") 
    ch()    // 'ch' is a first class function 
    print("Ended") 
} 

func closureFunc(){ 
    var num = 2 
    a({ 
     // access to 'num' is possible by closures 
     num = num*2 
     print(num) 
    }) 
} 

closureFunc() 
+1

すべてがよさそうだ - 。クロージャは 'self.'(明示的である必要があります)を含む、それらの外側のパラメータを、つかむことができます。 http://stackoverflow.com/questions/29022985/how-to-comprehend-the-first-class-function-in-swift?rq=1 – sschale

+0

あなたの質問が満足されたと感じる場合は、回答のうち – Alexander

答えて

5

これらの概念は直交しています。それらは直接関連していません。 Swiftの機能に関する2つの事実です。

  • 機能ファーストクラスです。つまり、変数として割り当てられ、引数として関数のパラメータに渡され、結果として関数から渡されます。

  • 機能はクロージャです。これは、定義の時点で、内の環境を取り込み、内の機能体がの外にあると宣言したことを意味します。機能体はです。

    func multiplierMaker(i:Int) -> (Int) -> (Int) { 
        func multiplier(ii:Int) -> (Int) { 
         return ii*i 
        } 
        return multiplier 
    } 
    let g = multiplierMaker(10) 
    g(2) // 20 
    

    機能multiplierについて考える:ここ

は(運動場からの)例である

  • multiplierは関数の結果として返すことができるという事実multiplierMakerであり、gに割り当てられており、明確なタイプの(Int) -> (Int)を持っているのは、機能がファーストクラス関数は、クロージャあるため

  • 10をmultiplierMakerに渡されたとき、結果として得られるmultiplier関数はgに割り当てられ、後で呼び出すも10によってそのパラメータを乗算する、という事実です。

(これは無名関数を行うには何もしていないことに注意してください。クロージャが匿名関数と関係していると考えるように導くすべての答えやステートメントは間違っています。この例では、無名関数はありません。匿名関数閉鎖ですが、すべて機能が閉鎖されているのみであるため)

8

ファーストクラス関数は、変数に代入して、任意の他の種類のデータであるかのように周りに渡すことができる機能を可能にする言語機能です。クロージャ、ラムダ、および無名関数はすべて「ファーストクラスの関数」です。またラムダ関数と呼ば

無名関数は、(ようa(ch:)名前を持っているとして)名前を持たない関数です。彼らは名前を持っていないので、それらを使用する唯一の方法は、それらを変数に格納するか、引数として渡すことです(パラメータは基本的に変数です)。したがって、すべての匿名関数もファーストクラス関数です。

クロージャは、周囲の状態をキャプチャするファーストクラスの関数です。彼らは匿名にすることも、名前を付けることもできます。名前付きクロージャは、通常のfunc関数です。

a(ch:)は高次関数です。

chは、本体が外部変数を参照するかどうかによって、ファーストクラス関数(変数に格納される)、ラムダ(FCFと同義)、場合によってはクロージャです。

このブロックでa(ch:)が呼び出された場合、chはキャプチャしているので、numです。

+1

"クローズは匿名関数です" No.All_関数はSwiftのクロージャです。 – matt

+0

これは答えに値する! – ospahiu

4

機能は、彼らが宣言されたコンテキスト内の変数を取り込むことができ、および「機能や撮影した変数の環境の組み合わせが呼び出される - 閉鎖」ここ

moreは閉鎖やファーストクラスの機能の簡単な説明がありますスウィフトに:

  1. 機能は、ファーストクラスのオブジェクトである、彼らは変数に割り当てることができ、それらを引数として渡すことができ、

  2. 2つの方法がありますを返すことができますSwiftでの関数の定義は、funcキーワードを使用し、 'クロージャ式'を使用するものです(クロージャを意味するわけではありません)。例えば

    func f() { print("nothing") } 
    
    let a = f // cannot use parentheses here 
    
    // or using closure expression: 
    let a = {() -> void in print("nothing") } 
    
  3. そして最後にあなたの質問に直接答え:関数は、彼らがで宣言されたコンテキスト内の変数をキャプチャし、できる「機能や撮影した変数の環境の組み合わせが呼び出される - 閉鎖」など

    func f() ->()->() 
    { 
        var c = 0 // local var 
    
        func innerf() 
        { 
         c += 1 // c is now captured 
        } 
    
        return innerf 
    } // normally c would be released here. but since its used in innerf(), it will stay 
    
    let f1 = f 
    

    これで変数を取得したので、f1をクロージャーと呼びます。

関連する問題