2014/06/29

[Swift, iOS]Swiftのmapとreduceについて書いてみた


Swiftについて勉強していく中で一番興味引かれたキーワードが「関数型言語」でした。
中でも以下のサイトを拝見させていただいたことで一気に関数型言語の理解が進みました!!
この場を借りて感謝を述べさせていただきます。

 ・Swiftで脱アルゴリズム!iOS開発を関数型(宣言型)プログラミングへパラダイムシフトしてみる【脱アルゴリズム宣言①】

(追記 22:26)
Swiftは関数型言語ではないという記事を見つけました。
 ・Swift Is Not Functional

mapとreduceについて

関数型言語と命令型プログラミング言語について語る上で、よく引き合いに出されるメソッドのようです。
この2つのメソッドを利用することで for文 や if文 を記述する回数を減らし、バグの少ないコードが書けます(理由は上記のサイトをどうぞ)。

Swiftでもmap, reduceが使える

Swiftでもmap, reduceが使えます!

let arry = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// map
let mapRet = arry.map{
    
    (var n) -> Int in
    
    return n + 2;

}
mapRet        // [2, 3, 4, 5, 6, 7, 8 ,9, 10, 11, 12]


// reduce1
println("reduceRet1")
let num = 0;       
let reduceRet1 = arry.reduce(num){     // |num| は |m| の初期値
    
    (var m, var n) -> Int in
    
    println("m = \(m), n = \(n)")
    
    return m + n    // return値が次の|m|の値となる
}
reduceRet1      // 55

mapについては特に説明不要でしょう。配列のすべての値に対して 2 を足しています。
reduceで注目すべきは num です。ここでは num の値を 0 としていますが、値を変更することで、 m の初期値を変更する事ができます。
m, nの具体的な値の変化は以下です。


非常に便利&完結にコードを書けますね。Swiftで開発するときは積極的に利用していくべきでしょう。

(おまけ)無名関数の書き方

以下のように色々な書き方ができるようです。
開発時はチーム内で統一した方がよさそうですね。

// reduce2
// return 削除
let reduceRet2 = arry.reduce(num){
    
    (var n, var m) -> Int in n + m
}

// reduce3
// さらに戻り値の型 削除
let reduceRet3 = arry.reduce(num){
    
    (var n, var m) in n + m
}

// reduce4
// $ のみで書く。変数 |n|, |m| の変わりです。
let reduceRet4 = arry.reduce(num){ $0 + $1 }




0 件のコメント:

コメントを投稿