【Swift】map関数の使い方!flatMap/compactMapとの違いと使い方
この記事からわかること
- Swiftのmap関数の使い方
- forEachやfor-inとの使い分け
- flatMap/compactMapの使用方法と違い
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swiftで配列や辞書型を操作できる便利な関数であるmapやflatMap、compactMapの使い方と違いについてまとめていきます。
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との使い分け
このような処理はforEach
やfor-in
を使用することでも実装可能です。これらとの使い分けは返り値が必要かどうかです。
map関数は全ての要素に任意の処理を実行した後その結果が適応された配列を返します。forEach
やfor-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関数
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関数
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]
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。