Swiftのmap,filter,reduceに慣れる
勉強不足でSwiftのcollection型にmapやreduceなどの関数が存在していることを知らずfor文で回してたので慣れるためにも幾つか遊んで見る。
map
引き数のクロージャ内でコレクションの値を計算して新しいコレクションを返す。
計算する
let arr = [1, 2, 3, 4] let arr2 = arr.map { $0 * 2 } // arr2 => [2, 4, 6, 8]
型変換
let arr = [1, 2, 3, 4] let arr2 = arr.map { (i: Int) -> String in return String(i) } // arr2 => ["1", "2", "3", "4"]
Dictionary型でもOK
let arr = ["a":1, "b":2, "c":3, "d":4] let arr2 = arr.map { (_: String, val: Int) -> Int in return val * 2 } // arr2 => [4, 2, 8, 6]
filter
引き数のクロージャ内の条件式でtrueを返す条件に合致した値のみのコレクションを返す。
よくある使い方
let arr = [1, 2, 3, 4] let arr2 = arr.filter { $0 % 2 == 0 } // arr2 => [2, 4]
Dictionary型に使う
タプルの配列で返ってくる。
let arr = ["a":1, "b":2, "c":3, "d":4] let arr2 = arr.filter { (key: String, val: Int) -> Bool in return key == "a" || key == "c" } // arr2 => [(.0 "a", .1 1), (.0 "c", .1 3)] // arr2[0].0 => "a"
reduce
コレクションの値をすべて組み合わせて新しい値を返す。
短く書く
let arr = [1, 2, 3, 4] let val = arr.reduce(0, +) // val => 10
クロージャを使う
let arr = [1, 2, 3, 4] let val = arr.reduce(0, { (accum: Int, current: Int) -> Int in accum + current }) // val => 10
チェーン
当然チェーンさせて組み合わせることもできる。
let arr = ["a":1, "b":2, "c":3, "d":4] let arr2 = arr.filter { (key: String, val: Int) -> Bool in return key == "a" || key == "c" }.map({ (key: String, val: Int) -> Int in return val * 2 }) // arr2 => [2, 6]
まとめ
他によく使うところでは、forEachやsortも組み込みで存在する。 次回はflatMapを含めてもうちょい深入りしてみよう。