前回は「filterの使い方」を書きました。
今回はmapの使い方を書きます。
mapは配列の各要素に関数を適用し、その結果からなる新しい配列を返す関数です。
["鳥", "花", "車"]
という文字列の配列から青い鳥と青い花と青い車
という文字列を組み立てるコードを書いていきます。
for in
文を使った場合です。
var result = ""
for element in ["鳥", "花", "車"] {
if result != "" {
result += "と"
}
result += "青い" + element
}
println(result)
実行結果は青い鳥と青い花と青い車
となります。
次にmapを使います。
ドキュメントを読むと、func map<U>(transform: (T) -> U) -> [U]
とあります。
TとUは型を示します。今回の場合はどちらともStringとなります。
このとおり書き換えると次のようになります。
println(join("と", ["鳥", "花", "車"].map({(element:String) -> String in return "青い" + element})))
1行になりました。
コードを分解してみてみます。
["鳥", "花", "車"].map({(element:String) -> String in return "青い" + element})
この実行結果は、[青い鳥, 青い花, 青い車]
となります。次にjoin
で配列を連結します。
filterのときと同様に$0を使って短く書くことができます。
println(join("と", ["鳥", "花", "車"].map{ "青い" + $0}))
数値の配列でも同様の処理ができます。
println([100, 200, 300].map{Int($0 * 1.08)}) // [108, 216, 324]
最後にTとUの型が異なる場合、例えばStringからIntに変換するコードを書いてみます。
男性だったら1に、女性だったら2に変換する例です。
このような文字列から定義された数値に変換する場面はよくあると思います。
println(["男性", "女性", "女性", "男性", "男性"].map{$0 == "男性" ? 1 : 2}) // [1, 2, 2, 1, 1]