LoginSignup
0
3

More than 3 years have passed since last update.

Swift クロージャのパターン

Posted at

この記事は何?

前回、クロージャを定数オブジェクトに代入して、呼び出しました。
今回は、パラメータ・返り値の有無で、記述がどう変わるかを確認します。

実行環境

以下の環境で、動作を確認しました。
- 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つだそうです。
ファーストクラス関数の要件には、他に...
関数をパラメータとして、関数に渡せる ことなどがあるそうです。

0
3
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
0
3