flatMapとチェーン
ネストしたコレクションを平坦化し、変換を連鎖させます。
「flatMapとチェーン」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
flatMapの2つの役割
シーケンスに対するflatMapは、入れ子を1階層分フラット化します。各要素に対してシーケンスを返すクロージャを適用し、それらのシーケンスをすべて連結して1つの平坦な配列にします。
入れ子の配列を平坦化する
配列の配列を1つの配列に変換します。
let nested = [[1, 2], [3, 4], [5]]
let flat = nested.flatMap { $0 }
print(flat) // [1, 2, 3, 4, 5]シーケンスを生成するflatMap
各要素から複数の要素を生成できます。
let nums = [1, 2, 3]
let expanded = nums.flatMap { [$0, $0 * 10] }
print(expanded) // [1, 10, 2, 20, 3, 30]すべての組み合わせを作る
flatMapは直積を作るときに便利です。
let suits = ["Hearts", "Spades"]
let ranks = ["A", "K"]
let deck = suits.flatMap { suit in ranks.map { "\($0) of \(suit)" } }
print(deck) // ["A of Hearts", "K of Hearts", "A of Spades", "K of Spades"]flatMapとcompactMapの違い
以前はflatMapにもOptionalをアンラップする役割がありましたが、その役割はcompactMapに移りました。現在は次のように使い分けます。
flatMap— 入れ子になったシーケンスを平坦化しますcompactMap— Optionalの結果からnilを取り除きます
単語を文字に分解する
各文字列をその文字に展開します。
let words = ["hi", "yo"]
let chars = words.flatMap { Array($0) }
print(chars) // ["h", "i", "y", "o"]サブ結果を結合する
入れ子になったモデルオブジェクトから項目を集めます。
struct Team { let members: [String] }
let teams = [Team(members: ["Ann", "Bo"]), Team(members: ["Cy"])]
let all = teams.flatMap { $0.members }
print(all) // ["Ann", "Bo", "Cy"]変換をチェーンする
チェーンの真価は、map、filter、flatMap、reduceを組み合わせたときに発揮されます。上から下へ読むことでデータパイプラインとして理解でき、各ステップが次のステップに新しいシーケンスを渡します。
完全なパイプライン
フィルタリング、平坦化、変換を行ってから、合計します。
let groups = [[1, 2, 3], [4, 5], [6]]
let result = groups
.flatMap { $0 }
.filter { $0 % 2 == 0 }
.map { $0 * $0 }
.reduce(0, +)
print(result) // 4 + 16 + 36 = 56flatMapの後にcompactMapを使う
まず平坦化し、その後でパース可能な値だけを残します。
let rows = [["1", "x"], ["3", "4"]]
let nums = rows
.flatMap { $0 }
.compactMap { Int($0) }
print(nums) // [1, 3, 4]チェーンを読みやすく保つ
各ステップを独自の行に配置し、チェーンが長くなったら中間結果に名前を付けます。すべてを1つの式に詰め込むより、読みやすさを優先してください。
let names = ["ann", "BO", "cy"]
let titled = names
.map { $0.lowercased() }
.map { $0.capitalized }
.sorted()
print(titled) // ["Ann", "Bo", "Cy"]理解度チェック
[[1, 2], [3]].flatMap { $0 }は何を返しますか。
復習
平坦化とチェーンについて学びました。
flatMapは入れ子になったシーケンスを1階層分平坦化します- Optionalを取り除くには、flatMapではなく
compactMapを使います filter/map/flatMap/reduceをチェーンして、読みやすいパイプラインを構築できます- 長いチェーンでは、1ステップを1行にすると明確になります
コース完了です。次は、遅延シーケンスです。
よくある質問
「flatMapとチェーン」レッスンは無料ですか?
はい。「flatMapとチェーン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「flatMapとチェーン」で何を学びますか?
ネストしたコレクションを平坦化し、変換を連鎖させます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「flatMapとチェーン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- mapとcompactMap
- filterと述語
- reduceとreduce(into:)
- flatMapとチェーン