🐤
Swiftの配列[Array]に使える基本的な関数🔰【map / filter / reduce】
はじめに
配列にめちゃめちゃ便利な関数があることを最近知ったので、基本的な3つを紹介していきたいと思います。
今回紹介するものは、配列の要素1つ1つに対してfor分みたいなループ処理を行える関数です。
配列の関数を使わなくてもfor文とかで一応実装はできますが、使った方がコードがシンプルになり、Swiftらしい書き方ができるので、覚えておくと良いです。✨
- map
- filter
- reduce
map
Apple Developer Documentation
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
Apple Developer Documentation
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
Apple Developer Documentation
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
うーん、めちゃくちゃシンプル。
まとめ
テストした上で記事を書いていますが、初心者が書いた記事なので、もしかしたら間違っているかも知れません。
その場合はお知らせください🙇🏻♂️
Discussion