geDemのアバターアイコン
geDem
 Blog
記事のカバー写真

Swiftの配列[Array]に使える基本的な関数🔰【map / filter / reduce】

geDemのアバターアイコン
geDem
ペン

はじめに

配列にめちゃめちゃ便利な関数があることを最近知ったので、基本的な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

うーん、めちゃくちゃシンプル。

まとめ

テストした上で記事を書いていますが、初心者が書いた記事なので、もしかしたら間違っているかも知れません。 その場合はお知らせください 🙇🏻‍♂️

🙂‍↕️最後まで読んでいただきありがとうございます🙂‍↕️