2015-01-13 14 views
8

私は迅速かつ閉鎖について学んでいます。 私はこの例に固執しています。Swiftのクロージャの例を理解していません

numbers.map({ 
    (number: Int) -> Int in 
    let result = 3 * number 
    return result 
}) 

(number:Int) - > Intとは何ですか?それは機能ですか?それはどこに定義されていますか? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

"in"というキーワードは何をしますか?ドキュメントは、 "引数を分離してボディから返す型"を使用すると言います。私はこれを理解しているか分からない。なぜ "in"が "return result = 3 * number"を "return result"から分離するのに使われないのですか?

+2

これはSwiftのクロージャーについても紹介しています。http://letvargo.mooo.com/a-beginners-guide-to-closures-in-swift/) –

答えて

28

閉鎖のの内容が閉鎖は、パラメータは括弧内に移動して、単に機能です、キーワードinを使用して、関数本体からパラメータを分離します。次の2つの例は、同等の機能を定義します。

func myFunc(number: Int) -> Int { 
    let result = 3 * number 
    return result 
} 

let myClosure = { (number: Int) -> Int in 
    let result = 3 * number 
    return result 
} 

あなたが実際に両方まったく同じ方法でそれらを呼び出すことができます。第二の例だけでは、最初のと全く同じであるか

let x = myFunc(2)  // x == 6 
let y = myClosure(2) // y == 6 

お知らせ最初の例では、パラメータ(number: Int) -> Intは角括弧の外側にあり、2番目の例ではパラメータは角括弧の内側にあり、その後にはキーワードinが続きます。

mapは、配列(例ではnumbers)をとり、numbersの各要素にクロージャ関数を適用した結果の新しい配列を作成することによって機能します。したがって、numbers[1, 2, 3]の場合、上記の例は1で始まります。 3を生成するクロージャー関数を適用します(最初の配列の要素に3を掛け合わせるだけです)。 numbersの各要素に対して、新しい配列が生成されるまで、[3, 6, 9]が生成されます。

もしあなたが望むのであれば、mapに上記の関数か上記のクロージャの名前を使うか、またはmapの中に明示的に書くことができます。以下の実施例の全ては、完全に等価である:実施例3実施例2で閉鎖が割り当てられているのに対し、閉鎖は、mapの内部に明示的に綴られている唯一の実施例3において、実施例2と同じであることを

let numbers = [1, 2, 3] 

// Example 1 
let times3 = numbers.map(myFunc)  // times3 == [3, 6, 9] 

// Example 2 
let timesThree = numbers.map(myClosure) // timesThree == [3, 6, 9] 

// Example 3 
let xThree = numbers.map({ (number: Int) -> Int in 
    let result = 3 * number 
    return result      // xThree == [3, 6, 9] 
}) 

myClosureという定数に、定数はmapに供給されています。

これは役に立ちます。閉鎖は楽しいですが、混乱します。

+0

私もクロージャーで立ち往生していますが、あなたの答え理解するのを助けてください。ありがとう。 –

+0

こんにちは、ローマに感謝します。これは確かに助けになりました。今は私にはとても分かりました。アップルの説明は最初の試しにはあまりにも急であった。 –

+0

ありがとうございます!このコードスニペットの仕組みを理解するのに本当に役立ちました。 –

1

あなたが呼び出している関数は、パラメータとして閉鎖を取ります

numbers.map({...}) 

それはあなたが呼び出された関数によって実行されたときの機能を提供閉鎖は、パラメータを受け取ることが予想されます。このパラメータは、あなたの閉鎖に定義されている:あなたは今、パラメータを使用することができ

(number: Int) -> Int in 

let result = 3 * number 
    return result 
0

クロージャは、自己完結型の機能ブロックで、コード内をパスして使用することができます。

構文:

{(parameterName: ParameterType) -> returnType in 
    //Statements 
} 

実用的なシナリオ:ユーザーがフィルタを適用すると、(この場合)300以上のある値を選択したい我々はこれをachiveするためにクロージャを使用することができます。コードの下から

var elements: [Int] = [Int]() //Declaring Empty array 
elements = [1001, 999, 555, 786, 988, 322, 433, 128, 233, 222, 201, 276, 133] 

var filteredElements = elements.map({(num: Int) -> Int? in 
    return num > 300 ? num : nil 
}) 

output: 
[Optional(1001), Optional(999), Optional(555), Optional(786), Optional(988), Optional(322), Optional(433), nil, nil, nil, nil, nil, nil] 

あなたは明らかに我々は()関数をelements.mapするクロージャを渡している見ることができます。

閉鎖:

{(num: Int) -> Int? in 
     return num > 300 ? num : nil 
    } 

(num:Int)は、パラメータです。 Int? Optional Integer Typeを返す予定ですか?

inの後、私たちはあなたのロジックを書くことができます。

閉鎖の詳細については、hereをご覧ください。

関連する問題