Filter
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 24/56。
filterは述語クロージャを受け取り、クロージャがtrueを返した要素のみを含む新しい配列を返します。
let nums = [1, 2, 3, 4, 5, 6]
let evens = nums.filter { $0 % 2 == 0 }
print(evens) // [2, 4, 6]結果は元の順序を保持します。結果の型は入力の型と一致し、変換は行われず、選択のみが行われます。
filter は map と自然に組み合わせることができます:
let big = nums
.filter { $0 > 2 }
.map { $0 * $0 }
print(big) // [9, 16, 25, 36]各チェーンをパイプラインのように、上から下へと読みます。各ステップは新しい配列を生成し、元の配列は変更されません。
チャレンジ
簡単2行の入力を読み取ります:
- カンマ区切りの整数のリスト
- 整数
min
以下の内容を、それぞれ別の行に出力してください:
minより大きい整数を,で連結したもの(該当するものがない場合は空行)- 該当する整数の2乗を
,で連結したもの - 該当する整数の個数
filter と map をチェーンとして使用してください。入力に対して2回反復処理を行わないようにしてください。
1行目の入力が 1,5,2,8,3,7 で、2行目の入力が 4 の場合、出力は以下のようになります:
5,8,7
25,64,49
3チートシート
条件に一致する要素を選択するには、filter を使用します:
let evens = [1,2,3,4].filter { $0 % 2 == 0 } // [2, 4]filter と map をパイプラインとして連結します:
let result = nums
.filter { $0 > 2 }
.map { $0 * $0 } // [9, 16, 25, 36]各ステップは新しい配列を返します。元の配列は変更されません。順序は維持されます。
自分で試してみよう
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let min = Int(readLine()!)!
// TODO: 一度 min より大きいものを filter し、次に平方に map する。両方を出力し、その後 count する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。