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
点数55、70、88のすべてに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へ短い変換処理を直接渡してから、これまでに学んだループで合計します。変換後は60、75、93なので、合計は228です。