こんにちは。池の端に咲く一輪の花、キュア・カイシャイン(会社員)こと畠山です。
iPhone6 の iOS 8、そして Swift の正式リリースがいよいよ近づいて来ましたよ。
Swift には Objective-C には無かった配列操作のためのメソッド map
, filter
, reduce
が導入されました。これにより、配列を操作するコードをより直感的に記述することができるようになります。
map
以下のような Objective-C なコードは、
NSArray *numbers = @[@1, @2, @3, @4, @5, @6, @7, @8, @9, @10];
NSMutableArray *result = [NSMutableArray array];
for (NSNumber *n in numbers) {
[result addObject:@(n.intValue * 2)];
}
result
//=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Swift の map
を使えば以下のように簡潔に書くことができます。
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers.map({ n in n * 2 })
//=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Swift ではクロージャのパラメータを $0, $1, $2, …のように省略することができます。パラメータを省略するとさらに短く書けます。
numbers.map({ $0 * 2 })
filter
整数の配列から偶数の要素のみを抜き出す処理は、Objective-C では NSPredicate
を使ってこんな風に書けます。
NSArray *numbers = @[@1, @2, @3, @4, @5, @6, @7, @8, @9, @10];
NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return [evaluatedObject intValue] % 2 == 0;
}];
[numbers filteredArrayUsingPredicate:pred];
//=> [2, 4, 6, 8, 10]
Swift だと filter
メソッドを使ってこんな風に書けます。
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers.filter({ $0 % 2 == 0 })
//=> [2, 4, 6, 8, 10]
reduce
配列内の整数の合計を求る処理は、Objective-C では集計用の変数 sum
を用意し、for
をグルグルまわしながら sum
へ加算することで合計を求めます。
NSInteger sum = 0;
for (NSNumber *n in numbers) {
sum += n.integerValue;
}
sum
//=> 55
Swift だと reduce
を使ってこんな風に書けます。
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers.reduce(0, { acc, n in acc + n })
//=> 55
パラメータの省略を使ってこんな風にも書けます。
numbers.reduce(0, { $0 + $1 })
まとめ
以上、Swift の Array に導入された map と reduce と filter の紹介でした。