この記事は何?
前回、クロージャを定数オブジェクトに代入して、呼び出しました。
今回は、パラメータ・返り値の有無で、記述がどう変わるかを確認します。
実行環境
以下の環境で、動作を確認しました。
- Xcode10.2.1
- Swift5.x
ハンズオン
コードを書いてみました。
こんな関数があったとして
ランダムな整数を出力する関数 randomNumber
です。
func randomNumber() -> Void {
print( Int.random(in: 1...Int.max) )
}
randomNumber() // 1~最大整数のランダムな整数
Void
は 存在しない と言う意味です。
つまり、-> Void
は 返り値がない ってことになります。
これは省略可能な記述なので、普段のコーディングでは記述されません。
クロージャのパターン
引数の有無で、全部で4つのパターンがあります。
いずれにしても {関数の型 in 実装}
となっている点を意識してみると、ふーんって感じになれます。
1. 引数なし・返り値なし
パラメータなし・返り値なし
let printRandomNumber = { () -> Void in
print(Int.random(in: 1...Int.max))
}
2. 引数あり・返り値なし
「出力するランダム整数の最大値」をパラメータとして指定できるようにしています。
パラメータあり・返り値なし
let printRandomNumberWithUpperBounds = { (upperBounds: Int) -> Void in
print(Int.random(in: 1...upperBounds))
}
3. 引数なし・返り値あり
パラメータなし・返り値あり
let getRandomNumber = { () -> Int in
return Int.random(in: 1...Int.max)
}
4. 引数あり・返り値あり
「取得するランダム整数の最小値と最大値」をパラメータとして指定できるようにしています。
パラメータあり・返り値あり
let getRandomNumberWithLowerAndUpperBounds = { (lowerBounds: Int, upperBounds: Int) -> Int in
return Int.random(in: lowerBounds...upperBounds)
}
ファーストクラス関数
オブジェクトに代入される関数のパターンを整理してみました。
が、「そりゃそうだ」みないな内容になってしまいました。
ちなみに...
関数をオブジェクトに代入できる ことは、第一級(ファーストクラス)関数 と言う要件を果たすための1つだそうです。
ファーストクラス関数の要件には、他に...
関数をパラメータとして、関数に渡せる ことなどがあるそうです。