array_data.filter { $0 > 2 }
というのはカッコが省略されていて、本来は
swift
1let biggerThan2 = array_data.filter({ $0 > 2 })
です。つまり、クロージャ { $0 > 2 }
は filter メソッドの引数であり、filter メソッドを呼び出す時点ではまだ実行されてません。(filter メソッドの中で、配列の各要素を引数として繰り返し呼び出されます。)
もっと言うと、クロージャをいったん変数に入れることも可能ですし、
swift
1// isBiggerThan2 の型は (Int) -> Bool つまり、整数を引数にとって論理値を返す関数
2let isBiggerThan2 = { $0 > 2 }
3let biggerThan2 = array_data.filter(isBiggerThan2)
これは func キーワードを使って関数定義するのと同じことになります。
swift
1func isBiggerThan2(x: Int) -> Bool {
2 return x > 2
3}
4
5let biggerThan2 = array_data.filter(isBiggerThan2)
また、クロージャを変数に入れると、自分でそれを呼び出すこともできます。
(残念ながら { $0 > 2 }(5)
のようにクロージャを変数に入れずに直接呼び出すことはできないようです。 ← 訂正: ({ $0 > 2 })(5)
のように括弧に入れたら呼び出せました。JavaScript なら (x => x > 2)(5)
とか書けるんですが…。)
swift
1let isBiggerThan2 = { $0 > 2 }
2print(isBiggerThan2(1)) // false
3print(isBiggerThan2(3)) // true
というわけで、{} と () の違いは、{} はクロージャの定義 (つまり関数を作ってる) で、() は関数の呼び出しです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。