俺、サービス売って家買うんだ

Swift, Vue.js, 統計, GCP / このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃなかろうか

Swiftのmap,filter,reduceに慣れる

f:id:ie-kau:20151120074851p:plain


勉強不足で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を含めてもうちょい深入りしてみよう。

参考