24 / 2788%

LESSON 24 ・ 関数

クロージャ

クロージャで関数を作る

let square = { (x: Int) -> Int in x * x }

let a = square(3)
print(a)

クロージャ(closure)を使えば、その場で関数を作ることができます。このコードでは、パラメータxを2乗して返すクロージャを作り、それをsquareに代入しています。

mapにクロージャを渡す

mapのためにわざわざ関数を定義するのは面倒です。

let a = [2, 3, 5]
let b = a.map { x in x * x }
print(b)

クロージャを使うと、mapで行いたい処理を直接渡すことができます。

let a = [2, 3, 5]
let b = a.map { x in x + 1 }
print(b)

2乗ではなく、1足したいならこのようになります。

PRACTICE

演習問題

コードを自分で書いて実行してから、答えと解説を確認しましょう。

問題1

整数を2乗して返す関数を、クロージャで作って変数squareに代入してください。square(4)の結果を表示してください。

答えと解説を見る

模範解答

let square = { (x: Int) -> Int in x * x }
print(square(4))

名前を付けて関数を定義する代わりに、その場で関数を作って変数へ代入できます。square(4)の結果は16です。

問題2

クロージャをmapへ直接渡し、[1, 4, 7]の各要素に1を足した結果を表示してください。

答えと解説を見る

模範解答

let numbers = [1, 4, 7]
let result = numbers.map { x in x + 1 }
print(result)

短い変換処理なら、別に関数を定義せず、その場で関数を作ってmapへ渡せます。結果は[2, 5, 8]です。

問題3

点数557088のすべてに5点を加えた新しい配列を、クロージャをmapへ直接渡して作ってください。さらに、変換後の点数をすべて足し、その合計を表示してください。

答えと解説を見る

模範解答

let scores = [55, 70, 88]
let adjusted = scores.map { score in score + 5 }

var total = 0
for score in adjusted {
    total += score
}

print(total)

mapへ短い変換処理を直接渡してから、これまでに学んだループで合計します。変換後は607593なので、合計は228です。