クロージャ
文の中に直接埋め込むことができる命令のかたまり
メソッドの処理内容を引数にそのまま記述できる
Button構造体の例
Button構造体(UI部品)のドキュメントを見ると、以下のように記述されている。
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などの記述は省略しているが、プレビューだと以下のようになる
引数にクロージャを指定する
上記の記述だと、毎回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("カウント")
}
まとめ
- クロージャとは、引数の中にメソッドの処理を記述することができる
- トレイリングクロージャとは、引数の最後がクロージャで終わる時、そのクロージャを外に出すことができる