質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

267閲覧

関数への引数の渡し方について

yamyams

総合スコア1

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/06/15 12:58

  • 質問内容

下記のコードですが、filterメソッドにクロージャを渡すときに、波括弧{}を使用しますが、
なぜ丸括弧()ではなく、波括弧{}なのでしょうか?

関数の実行は丸括弧()で実行しますので、
メソッドの実行もまた、丸括弧()で実行するのではないかと思ったのですが、
なぜ波括弧{}なのでしょうか?

  • コード

Swift

1let array_data = [1, 2, 3, 4] 2let biggerThan2 = array_data.filter{ $0 > 2}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

というわけで、{} と () の違いは、{} はクロージャの定義 (つまり関数を作ってる) で、() は関数の呼び出しです。

投稿2022/06/15 13:47

編集2022/06/15 13:56
hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問