クロージャは、”関数閉包“と呼ばれる特殊な関数です。
普通の関数と似ていますが、一般的な関数のように名前をつける必要が無く
指定した変数や引数に
関数で行っている処理を直接代入します。
サンプルコードなどを参照するとかなりの割合で使われています。
使い方を覚えることで、開発の柔軟性が上がると思いますので
しっかりと使い方を身につけましょう。
・クロージャの定義について
・クロージャの基本的な使い方について
・クロージャを返す関数の使い方について
- Swiftのオススメの勉強法
SwiftUIでアプリ開発を始める時の勉強法。どうする? - プレイグラウンドの使い方
【Swiftのお勉強】プレイグラウンドを使ってSwiftを勉強しよう!- SwiftUIアプリ開発基礎 - Swiftでの変数の宣言の仕方
【Swiftのお勉強】変数の宣言と代入の仕方〜四則演算 – SwiftUIアプリ開発基礎 - Swiftでの定数の宣言の仕方
【Swiftのお勉強】Swiftでの定数の宣言(let)の仕方 – SwiftUIアプリ開発基礎
1.【Swiftのお勉強】クロージャの定義について
クロージャの定義の仕方は以下になります。
{([引数]) -> [戻り値の型] in [処理] }
省略できる場合もありますが
「引数」、「戻り値の型」、「処理」
の三つを指定する必要があります。
書き方が異なるだけで一般的な関数と基本的には変わりません。
特殊なだけで、クロージャも関数の一種であるということを頭に置いて
使い方を確認していきましょう。
2.【Swiftのお勉強】クロージャの使用方法
クロージャは用途によって、定義を省略することが出来ます。
省略系で書かれているクロージャ文も多いので
省略系も一緒に覚えてしまいましょう。
1. 引数と戻り値が定義されているクロージャ
省略されずに書かれているクロージャの例です。
(n:Int) -> 「処理」で使用される引数の名前:引数の型
Int -> 戻り値の型
n/2 -> 処理の内容
となっており、このような短い文の場合
returnは省略出来ます。
var closure = {(n:Int) -> Int in return n/2 } closure(100) //50
こちらでも可能。
1文しかないので、”n/2″が戻り値になることが自明だからです。
var closure = {(n:Int) -> Int in n/2 }
2. 戻り値の型を定義しないクロージャの使い方
シンプルな形でのクロージャの使い方です。
“引数の型“と”戻り値の型“は省略されており、「引数の定義」と「処理」のみが書かれています。
このように短い処理の場合は、戻り値の型を定義する必要がありません。
//省略クロージャ文 var closure1 = {n in n*2 } //呼び出し closure1(100) //200
3. 省略出来ないクロージャの場合
省略出来る短い処理ばかり取り上げましたが
処理が長い場合は省略出来ません。
処理が長くなってくると
Swiftのコンパイラが
どこでreturnを返すべきか、分からなくなってしまいます。
プレイグラウンドを使用している人は
“return”を削除してみると良いでしょう。
以下のようなエラーが出力されるかと思います。
var closure2 = {(n:Int) -> Int in var result = 0 result = n*100 return result } closure2(100) //10000
3.【Swiftのお勉強】クロージャを返す関数について
関数の処理を直接変数に閉じ込める処理ばかり紹介してきました。
クロージャの一番の利点は
クロージャを返す関数を使用出来る点にあります。
結構、難しいですね
関数が”関数を返り値に持つ“のです。
1. クロージャを返す関数の定義
func [関数の名前] -> ([引数の型1]) -> [返り値の型1]{ [処理1] return { ([引数: 引数の型]) -> [返り値の型] in [処理2] } }
このように、関数自体が返り値を持つような式を作ることが出来ます。
少しだけ処理内容を紐解いてみます。
・([引数の型1]) -> [返り値の型1]
クロージャを返り値に持つ関数ですよと言う意味です
変数や定数にこの関数を代入すると
ここで定義されている型を持った
クロージャが変数や定数に代入されます。
return { ([引数: 引数の型]) -> [返り値の型] in [処理2] }
返されるクロージャの処理内容を表しています。
変数や定数には、上記の処理が含まれるクロージャが代入されます。
具体的な使い方は次の章で見ていきます。
2. クロージャを返す関数の使用方法
実際に使用している例をみてみましょう
//クロージャを返す関数 func clfunc() -> (Int)-> Int{ var result3 = 0 return {(value:Int)->Int in result3 = value*10 return result3 } } //クロージャを定数に代入 let result_func = clfunc() //Int型の数字を引数にいれて、クロージャの処理を実施 result_func(100) //1000
Swiftのチュートリアルやライブラリで
このように複雑な関数の定義の仕方をしていることもあります。
アプリ開発の理解を深めるためにも
このような方法があると言うことを覚えておきましょう。
4.【Swiftのお勉強】まとめ
今回はクロージャの基本的な使い方とクロージャを返す関数について紹介しました。
クロージャを返す関数は、一回見ただけだと頭が混乱するかと思います。
初めて見たという方は、Xcodeのプレイグラウンドを使って勉強してみることをオススメします。
複雑ですが、何回か自分で書いているうちに分かるようになるかと思います。
┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘
IT・Web・ゲーム業界のエンジニア転職なら【Tech Stars Agent】
https://px.a8.net/svt/ejp?a8mat=3H5G2S+AM8B5E+3TVC+TSBEB
┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘
コメント