Help us understand the problem. What is going on with this article?

Swift クロージャのパターン

この記事は何?

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

実行環境

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away