導入
「配列の全要素を2倍」「条件に合うものだけ残す」――こうした処理を短く書くのが クロージャ(名前のない関数)と高階関数です。SwiftUIでもボタンの動作などで毎回使います。
説明
クロージャは { 引数 in 処理 } の形。配列の map は各要素を変換し、filter は条件に合うものを残し、reduce はひとつの値にまとめます。
let nums = [1, 2, 3, 4, 5]
let doubled = nums.map { $0 * 2 } // 各要素を2倍
let evens = nums.filter { $0 % 2 == 0 } // 偶数だけ
let total = nums.reduce(0) { $0 + $1 } // 合計
print(doubled) // [2, 4, 6, 8, 10]
print(evens) // [2, 4]
print(total) // 15
$0 は「1つ目の引数」を表す省略記法です。reduce(0) の 0 は初期値、$0 が「これまでの合計」、$1 が「今の要素」です。
クロージャは関数の引数としても渡せます。SwiftUIの Button("押す") { ... } の { ... } も、まさにこのクロージャです。
let names = ["Bob", "alice", "Carol"]
let sorted = names.sorted { $0.lowercased() < $1.lowercased() }
print(sorted) // ["alice", "Bob", "Carol"]
やってみよう
map の中身を $0 + 100 に変えたり、filter の条件を $0 > 2 にしたりして、結果の変化を見てみましょう。
演習
[3, 8, 1, 9, 4] から filter で「5以上」の要素だけ残し、その配列を print してください。
ヒント1を見る
let big = [3,8,1,9,4].filter { $0 >= 5 }
ヒント2を見る
print(big)