LoginSignup
1
2

More than 1 year has passed since last update.

【Swift】クロージャ、トレイリングクロージャとは

Last updated at Posted at 2021-09-17

クロージャ

文の中に直接埋め込むことができる命令のかたまり
メソッドの処理内容を引数にそのまま記述できる

Button構造体の例

Button構造体(UI部品)のドキュメントを見ると、以下のように記述されている。
スクリーンショット 2021-09-17 13.53.03.png

init(action: () -> void, label: () -> label)

() -> void この書式は「関数の型」を表している。
->の左側が「引数」で、右側が「戻り値の型」
つまり、引数actionには、「引数なし」で「戻り値」がない、
関数を指定すればよいということが分かる。

メソッドは関数の1種なので、引数actionにはメソッドも指定することができる。

Buttonのactionにメソッドを入れてみる

今までの説明から以下にようなコードを記載することができる

// actionにメソッドを指定
Button(action: count){
 Text("カウント")
}
// メソッドの宣言
func count(){
 self.number += 1
}

上記よりButtonが押下されたnumberプロパティに1加算されることになる。

Viewなどの記述は省略しているが、プレビューだと以下のようになる
スクリーンショット 2021-09-17 14.24.21.png

引数にクロージャを指定する

上記の記述だと、毎回Buttonの引数action:に、
メソッド名を指定しなければならない。

これが一度しか使わないメソッドの場合、コードが煩雑に見える。
そこで現れたのが「クロージャ」である

クロージャは、引数にそのままメソッドの処理内容を記述できる。

// 中括弧{}に処理を記述
Button(action: {self.number += 1}){
 Text("カウント")
}

// メソッドは不要になる
// func count(){
//  self.number += 1
// }

クロージャの書式

今までのクロージャは「引数」や「戻り値」がないため、省略した記述をしたが、
戻り値が存在する場合は、以下の記述が必要になる

// 書式
{(引数名: ) -> 戻り値の型 in
 
}

// Button
Button(action: {() -> void in self.number += 1}){
 Text("カウント")
}

トレイリングクロージャ

トレイリングクロージャとは、以下の条件の場合、
そのクロージャを()の中から外に出して、引数名を省略できること。

  • 最後の引数がクロージャの場合

Button構造体のドキュメントで以下の記述があったと思う。

init(action: () -> void, label: () -> label)

引数actionは先程クロージャにできたので、
引数labelもクロージャにすることができる。
※ labelはButton内のテキストを指定する
つまり、以下の記述が可能になる。

Button(action: { self.number += 1}, label: { Text("カウント") })

しかし、 トレイリングクロージャの条件に当てはめると、
以下の記述ができる。

// トレイリングクロージャ未使用
// 引数の最後がクロージャ
Button(action: { self.number += 1}, label: { Text("カウント") })

// トレイリングクロージャを使用
// 引数名labelを省略
// クロージャを()の外に出して記述
Button(action: {() -> void in self.number += 1}){
 Text("カウント")
}

まとめ

  • クロージャとは、引数の中にメソッドの処理を記述することができる
  • トレイリングクロージャとは、引数の最後がクロージャで終わる時、そのクロージャを外に出すことができる
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2