【Swift】map関数の使い方!flatMap/compactMapとの違いと使い方

この記事からわかること

  • Swiftmap関数使い方
  • forEachfor-inとの使い分け
  • flatMap/compactMap使用方法違い

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Swiftで配列や辞書型を操作できる便利な関数であるmapやflatMap、compactMapの使い方と違いについてまとめていきます。

map関数とは?

公式リファレンス:map関数

func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]

map関数とは配列に対して引数に渡したクロージャーを全ての要素に対して実行した配列を返す関数です。クロージャー内では$0形式で配列内の要素にアクセスでき、任意の処理を行わせることができます。

おすすめ記事:【Swift】クロージャとは?関数との違いとキャプチャの意味

例えば以下は「配列内の全ての要素の値を10倍」にします。

let numbers = [1, 2, 3, 4, 5, 6]
let newNumbers = numbers.map { $0 * 10 }
print(newNumbers) // [10, 20, 30, 40, 50, 60]

forEachやfor-inとの使い分け

このような処理はforEachfor-inを使用することでも実装可能です。これらとの使い分けは返り値が必要かどうかです。

map関数は全ての要素に任意の処理を実行した後その結果が適応された配列を返しますforEachfor-in値を返さないので処理を実行させたい時だけに使います。

let lang = ["HTML","CSS","JavaScript","PHP","Swift"]

for value in lang{
    print(value) // HTML CSS JavaScript PHP Swift
}

lang.forEach { value in
    print(value) // HTML CSS JavaScript PHP Swift
}

おすすめ記事:【Swift】for-in文の使い方!配列や数値レンジの指定方法

flatMap関数

公式リファレンス:flatMap関数

func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence

flatMap関数はクロージャー内に渡された多次元配列を一次元配列に変換した配列を返す関数です。

let numbers = [[1], [1,2], [2,3], [4,5,6]]

let mapped = numbers.map { $0.map { $0 } }
print(mapped) // [[1], [1, 2], [2, 3], [4, 5, 6]]

let flatMapped = numbers.flatMap { $0.map { $0 } }
print(flatMapped) // [1, 1, 2, 2, 3, 4, 5, 6]

compactMap関数

公式リファレンス:compactMap関数

func compactMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

compactMap関数は配列内のnilを除去した配列を返す関数です。

let numbers = [1,nil,3,nil,5,nil,nil,7]

let mapped = numbers.compactMap{ $0 }
print(mapped) // [1, 3, 5, 7]

compactMap関数を使用することで配列内の要素の中で数値に変換できる値のみを取得することも可能です。

let numbers = ["1", "2", "three", "/4/", "5"]

let mapped: [Int?] = numbers.map { str in Int(str) }
print(mapped) // [Optional(1), Optional(2), nil, nil, Optional(5)]

let compactMapped: [Int] = numbers.compactMap { str in Int(str) }
print(compactMapped) // [1, 2, 5]

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index