Swiftで配列の全ての要素値を変換する方法について記載します。
目次
全ての要素値を変換する方法
配列の全ての要素値を変換するメソッドは3つあります。
1. map メソッド
変換した結果、nil になった要素は、nil で返されます。
2. compactMap メソッド
変換した結果に nil が含まれる場合、戻り値には nil を含まない配列を返します。
3. flatMap メソッド
変換した結果が多次元配列になる場合、1次元に変換した結果を返します。
表でまとめると次のようになります。
メソッド | 戻り値に nil を含む | 戻り値の配列の次元数 |
---|---|---|
map | ○ | 多次元配列になることがある |
compactMap | × | 多次元配列になることがある |
flatMap | ×(非推奨) | 多次元の場合、一次元配列に変換する |
1. map メソッド
引数
要素値の変換処理をクロージャーで指定します。
戻り値
クロージャーで変換された結果(nilを含む)を返します。
実行例(各要素を大文字に変換)
1 2 3 4 5 6 7 8 |
let strs1 = ["aaa","bbb","ccc","ddd","eee"] // 各要素を大文字に変換した配列が返されます。 let result1 = strs1.map{ $0.uppercased() } print(result1) // ["AAA", "BBB", "CCC", "DDD", "EEE"] // 元の配列の値は変換されません。 print(strs1) // ["aaa", "bbb", "ccc", "ddd", "eee"] |
実行例(変換出来ない値はnilで返される)
1 2 3 4 5 6 7 |
let strs2 = ["1","a","3","b","5"] // 数値に変換 let result2 = strs2.map{ Int($0) } // 数値に変換出来ない値("a"、"b")は nil で返されます print(result2) // [Optional(1), nil, Optional(3), nil, Optional(5)] |
2. compactMap メソッド
map メソッドとの違いは、変換後の要素に nil が含まれる場合、nil が含まれない配列を返します。
実行例(nil は戻り値に含まれない)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
let strs1 = ["1","a","3","b","5"] // mapメソッド(変換後の要素に nil が含まれる) let result1 = strs1.map{ Int($0) } print(result1) // [Optional(1), nil, Optional(3), nil, Optional(5)] // compactMapメソッド(変換後の要素に nil が含まれない) let result2 = strs1.compactMap{ Int($0) } print(result2) // [1, 3, 5] // flatMapメソッドも変換後の要素に nil が含まれませんが // オプショナル型の値を返す場合は非推奨と警告が出ます let result3 = strs1.flatMap{ Int($0) } print(result3) // [1, 3, 5] |
3. flatMap メソッド
map メソッドとの違いは、変換した結果が多次元配列になる場合、一次元に変換した結果を返します。
次の実行例では、配列の各要素ごとに区切り文字 “-” で分割し、結果が配列として返されるため
map メソッドでは、そのまま二次元配列で返されますが
flapMapメソッドでは、一次元配列に変換された値が返ります。
実行例(多次元配列は一次元配列で返される)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
let strs1 = ["1-1","2-2","3-3","4-4","5-5"] // mapメソッドの戻り値は、多次元配列になることがある let result1 = strs1.map{ $0.split(separator: "-") } print(result1) // [["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"]] // flatMapメソッドの戻り値は、1次元配列になる let result2 = strs1.flatMap{ $0.split(separator: "-") } print(result2) // ["1", "1", "2", "2", "3", "3", "4", "4", "5", "5"] // compactMapメソッドの戻り値は、多次元配列になることがある let result3 = strs1.compactMap{ $0.split(separator: "-") } print(result3) // [["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"]] |