はじめに
普段はRubyやPHPを学習しておりますが、少しSwiftの配列、ハッシュ(辞書)型のメソッドを教えていただきました。
せっかくなので記事にしたいと思います。
同じような境遇(あまりアプリ側に触れない)の方に、「へ〜、そうなんだ」と思ってもらえたら嬉しいです。
本日取り上げるのは、Ruby on Railsで馴染み深いメソッドのSwift版になります。
配列(Array)
まずは配列です。
例として、下記を使用します。
1 2 | // Array varnumbers:[Int]=[0,1,2,3,4,5,6,7,8,9] |
filter
クロージャで指定した条件を満たす、新しい配列を返却します。
例として、2の倍数を取得する処理を記述します。
1 2 3 4 5 | letevenNumbers:[Int]=numbers.filter{(value:Int)->Boolin returnvalue%2==0 } print(evenNumbers) // => [0, 2, 4, 6, 8] |
上記のようにクロージャを渡すのですが、第一引数に$0
でアクセスでき、下記のように簡略にすることもできます。
1 2 3 | letevenNumbers:[Int]=numbers.filter{$0%2==0} print(evenNumbers) // => [0, 2, 4, 6, 8] |
map
配列の1つ1つにクロージャで指定した処理を行った配列の結果を返却します。
例として、1つ1つの要素を2倍にする処理を記述します。
1 2 3 4 5 | letdoubleNumbers:[Int]=numbers.map{(value:Int)->Intin returnvalue*2 } print(doubleNumbers) // => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] |
簡略式も下記に記載します。
1 2 3 | letdoubleNumbers:[Int]=numbers.map{$0*2} print(doubleNumbers) // => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] |
reduce
要素のたたみ込みをするためのメソッドです。要素をまとめて一つにする場合などで利用できます。
例として、要素の合計値を取得する処理を記述します。
1 2 3 4 5 | lettotalNumber=numbers.reduce(0){(total:Int,value:Int)->Intin total+value } print(totalNumber) // => 45 |
簡略式も下記に記載します。
1 2 3 | lettotalNumber=numbers.reduce(0){$0+$1} print(totalNumber) // => 45 |
辞書(Dictionary)
辞書に関しても上記のfilter
、map
、reduce
のメソッドは使えます。簡略式ですが、こちらも記載しておきます。
まずは、例で操作対象となる辞書を宣言しておきます。
1 2 | // Dictionary vardictNumbers=["zero":0,"one":1,"two":2,"three":3,"four":4,"five":5,"six":6,"seven":7,"eight":8,"nine":9] |
filter
Dictionaryのため、順序保証がないのと、返却値はタプルの配列になっています。
1 2 3 | letevenDictNumbers=dictNumbers.filter{$0.1%2==0} print(evenDictNumbers) // => [("four", 4), ("zero", 0), ("two", 2)] |
map
こちらもタプルとしています。
ただ、辞書で返却したい場合が多いと思います。その場合は、次項のreduce
のやり方がオススメです。
1 2 3 | letdoubleTupleNumbers=dictNumbers.map{($0.0,$0.1*2)} print(doubleTupleNumbers) // => [("three", 6), ("one", 2), ("nine", 18), ("seven", 14), ("four", 8), ("five", 10), ("zero", 0), ("six", 12), ("eight", 16), ("two", 4)] |
reduce
1 2 3 | letdoubleDictNumbers=dictNumbers.reduce([String:Int]()){varvarDict=$0;varDict[$1.0]=$1.1*2;returnvarDict} print(doubleDictNumbers) // => ["three": 6, "one": 2, "nine": 18, "seven": 14, "four": 8, "five": 10, "zero": 0, "six": 12, "eight": 16, "two": 4] |
上記で、注意点としては、一度$0
をvarDict
変数に代入しているところです。これは、$0
がイミュータブルな変数だからです。
そのため、下記ではエラーとなります。
1 2 | letdoubleDictNumbers=dictNumbers.reduce([String:Int]()){$0[$1.0]=$1.1*2;return$0} // =>Cannot assign through subscript: '$0' is immutable |
さいごに
いかがでしたか?
Ruby on Railsではおなじみのメソッドですが、少しSwiftならではの制約があります。
ただ、とても可読性が高く、便利なメソッドではないでしょうか?