Menu
Coddy logo textTech

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]

結果は元の順序を保持します。結果の型は入力の型と一致し、変換は行われず、選択のみが行われます。

filtermap と自然に組み合わせることができます:

let big = nums
    .filter { $0 > 2 }
    .map { $0 * $0 }
print(big)                   // [9, 16, 25, 36]

各チェーンをパイプラインのように、上から下へと読みます。各ステップは新しい配列を生成し、元の配列は変更されません。

challenge icon

チャレンジ

簡単

2行の入力を読み取ります:

  1. カンマ区切りの整数のリスト
  2. 整数 min

以下の内容を、それぞれ別の行に出力してください:

  1. min より大きい整数を , で連結したもの(該当するものがない場合は空行)
  2. 該当する整数の2乗, で連結したもの
  3. 該当する整数の個数

filtermap をチェーンとして使用してください。入力に対して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]

filtermap をパイプラインとして連結します:

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 する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン