本文へスキップ
BecomeCoder

Swift(iOSアプリ)コース · 第4章 型と関数でモデルを作る · レッスン14

クロージャと map / filter / reduce

ブラウザで完結

導入

配列の全要素を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)

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Swift / SwiftUI — ブラウザ内で実行(学習用)

Swiftの教材サブセットを動かす学習用ランナーを読み込みます。ふつうのコードは print の出力を表示し、SwiftUI(struct: View)を書くと右にiPhone風のライブプレビューを描画します(本物のXcode/Swiftコンパイラではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。