compactMap
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 28/56。
compactMap は、オプショナル(Optional)が取り除かれた map です。クロージャは Optional を返すことができ、compactMap は nil の結果を除外して、残りをアンラップします。
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 は、これら両方のステップを一度に行います。
チャレンジ
簡単1行の入力を読み込みます。これは、整数とゴミテキスト(解析できないエントリ)がカンマで区切られた混合データです。
以下を出力してください:
- 整数(入力順)、
,で連結したもの - 破棄された(解析できなかった)エントリの数
- 解析された整数の合計
入力が 3,hi,7,!,1,42,oops の場合、出力は以下のようになります:
3,7,1,42
3
53チートシート
compactMapはmapのように動作しますが、自動的にnilの結果を除去し、残りをアンラップします:
let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
// [3, 7, 1] — 解析不可能な文字列からのnilは除外されますcompactMapがない場合、mapはnilが混ざった[Int?]を返し、別途フィルタリングの手順が必要になります。
自分で試してみよう
let parts = readLine()!.components(separatedBy: ",")
// TODO: compactMap で ints に変換し、joined、除外された数、合計を print する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。