Menu
Coddy logo textTech

compactMap

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 28/56。

compactMap は、オプショナル(Optional)が取り除かれた map です。クロージャは Optional を返すことができ、compactMapnil の結果を除外して、残りをアンラップします。

let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
print(numbers)               // [3, 7, 1]

Int("hi")"hi" から数値を解析できないため、nil を返します。compactMap はそれらを自動的に取り除き、きれいな [Int] を返します。

それがないと、strings.map { Int($0) } と記述して nil が混ざった [Int?] を取得することになり、その後で自分自身でそれらを取り除かなければなりません。compactMap は、これら両方のステップを一度に行います。

challenge icon

チャレンジ

簡単

1行の入力を読み込みます。これは、整数とゴミテキスト(解析できないエントリ)がカンマで区切られた混合データです。

以下を出力してください:

  1. 整数(入力順)、, で連結したもの
  2. 破棄された(解析できなかった)エントリの数
  3. 解析された整数の合計

入力が 3,hi,7,!,1,42,oops の場合、出力は以下のようになります:

3,7,1,42
3
53

チートシート

compactMapmapのように動作しますが、自動的にnilの結果を除去し、残りをアンラップします:

let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
// [3, 7, 1]  — 解析不可能な文字列からのnilは除外されます

compactMapがない場合、mapnilが混ざった[Int?]を返し、別途フィルタリングの手順が必要になります。

自分で試してみよう

let parts = readLine()!.components(separatedBy: ",")

// TODO: compactMap で ints に変換し、joined、除外された数、合計を print する
quiz icon腕試し

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

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