Swiftの配列[Array]に使える基本的な関数🔰【map / filter / reduce】
はじめに
配列にめちゃめちゃ便利な関数があることを最近知ったので、基本的な3つを紹介していきたいと思います。
今回紹介するものは、配列の要素1つ1つに対して for 分みたいなループ処理を行える関数です。
配列の関数を使わなくても for 文とかで一応実装はできますが、使った方がコードがシンプルになり、Swift らしい書き方ができるので、覚えておくと良いです。✨
- map
- filter
- reduce
map
func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]
map 関数は、配列に入っている値1つ1つをループ処理で変更する関数です。
例として、配列の中身を 2 倍にする処理を書いてみます。
// デフォルトの配列を宣言
let array: [Int] = [1, 2, 3, 4, 5]
// [mappedArray]に、ループ処理で2倍した[array]の要素を代入
let mappedArray: [Int] = array.map { number in
// 注意: [*=]ではない
number * 2
}
// 結果をプリント
print(mappedArray)
// 結果
// [2, 4, 6, 8, 10]
ちなみに今回の場合、処理が簡単なので以下のように省略できます。
// デフォルトの配列を宣言
let array: [Int] = [1, 2, 3, 4, 5]
// [mappedArray]に、ループ処理で2倍した[array]の要素を代入
let mappedArray: [Int] = array.map { $0 * 2 }
// 結果をプリント
print(mappedArray)
// 結果
// [2, 4, 6, 8, 10]
filter
func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
filter 関数は、配列の中から条件に合う要素を取り出すことができる関数です。
例として、配列から 3 未満の要素を取り出す処理を書いてみます。
// デフォルトの配列を宣言
let array: [Int] = [1, 2, 3, 4, 5]
// [mappedArray]に、ループ処理で3未満の[array]の要素を代入
let filteredArray = array.filter { number in
number < 3
}
// 結果をプリント
print(filteredArray)
// 結果
// [1, 2]
省略形は以下の通り
// デフォルトの配列を宣言
let array: [Int] = [1, 2, 3, 4, 5]
// [mappedArray]に、ループ処理で3未満の[array]の要素を代入
let filteredArray = array.filter { $0 < 3 }
// 結果をプリント
print(filteredArray)
// 結果
// [1, 2]
reduce
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
reduce 関数は、配列の要素をまとめるとき(集計など)に使える関数です。
reduce は、「減らす」のイメージが強いかと思いますが、swift の reduce は、「まとめる」の意味です。
すこし説明が難しいのですが、一旦、配列の中身の合計を出す処理を書いてみます。
// デフォルトの配列を宣言
let array: [Int] = [1, 2, 3, 4, 5]
// reducedValueに、ループ処理で[array]の要素を足していって代入
let reducedValue: Int = array.reduce(0){ (num1, num2) -> Int in
num1 + num2
}
// 結果をプリント
print(reducedValue)
// 結果
// 15
reduce 関数は初期値を決める引数を持っており、今回は 0 としています。
num1 と num2 について、num1 が、配列から取り出された num2 を足される関係と考えるとわかりやすいかと思います。
ためしに、reduce 関数のところを、num1 と num2 がプリントされるように変更してみます。
// 変更前
num1 + num2
// 変更後
print("num1:",num1)
print("num2:",num2)
return num1 + num2
結果は以下の通り
// 1週目
num1: 0
num2: 1
// 2週目
num1: 1
num2: 2
// 3週目
num1: 3
num2: 3
// 4週目
num1: 6
num2: 4
// 5週目
num1: 10
num2: 5
15
こんな感じです。
ちなみに、省略すると以下のようにも書けます。
// デフォルトの配列を宣言
let array: [Int] = [1, 2, 3, 4, 5]
// reducedValueに、ループ処理で[array]の要素を足していって代入
let reducedValue: Int = array.reduce(0, +)
// 結果をプリント
print(reducedValue)
// 結果
// 15
うーん、めちゃくちゃシンプル。
まとめ
テストした上で記事を書いていますが、初心者が書いた記事なので、もしかしたら間違っているかも知れません。 その場合はお知らせください 🙇🏻♂️
🙂↕️最後まで読んでいただきありがとうございます🙂↕️