0Pricing
Swift Academy · レッスン

ストリームの変換と結合

flatMap、merge、combineLatest、zipを使用します。

「ストリームの変換と結合」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

ストリームを扱う

Combineでは、パブリッシャーが時間の経過とともに値のストリームを発行します。真価を発揮するのは、これらのストリームを変換して新しいストリームへ組み合わせる演算子です。

このレッスンでは、変換と結合に使用する重要な演算子であるflatMap、merge、combineLatest、zipを扱います。

mapとflatMap

mapは各値を別の値へ変換します。flatMapはさらに進んで、各値を新しいパブリッシャーへ変換し、その結果を1つのストリームに平坦化します。

各入力で別の非同期処理を開始したい場合は、flatMapを使用します。

flatMapの動作

ここでは、ユーザーIDのストリームをネットワークリクエストのストリームへ変換し、1つのユーザーのストリームに平坦化しています。

userIdPublisher
    .flatMap { id in
        apiClient.fetchUser(id: id)
    }
    .sink { user in
        print("Loaded", user.name)
    }
    .store(in: &cancellables)

flatMapの同時実行数を制御する

デフォルトでは、flatMapはすべての内部パブリッシャーを一度に購読します。maxPublishersで同時実行数に上限を設定し、サーバーへの過剰なリクエストを防げます。

idsPublisher
    .flatMap(maxPublishers: .max(2)) { id in
        apiClient.fetchUser(id: id)
    }
    .sink { print($0) }
    .store(in: &cancellables)

merge

mergeは、同じ型の複数のパブリッシャーから値を1つのストリームへインターリーブし、各値を到着した時点ですぐに発行します。

let combined = buttonTapA
    .merge(with: buttonTapB)

combined
    .sink { print("A tap from either button") }
    .store(in: &cancellables)

combineLatest

combineLatestは、いずれかの入力パブリッシャーが値を発行するたびに、各パブリッシャーの最新値を組み合わせて発行します。複数のフィールドをすべて考慮する必要があるフォームのバリデーションに最適です。

usernamePublisher
    .combineLatest(passwordPublisher)
    .map { name, pass in
        !name.isEmpty && pass.count >= 8
    }
    .sink { isValid in
        print("Form valid:", isValid)
    }
    .store(in: &cancellables)

combineLatestの動作

注意:combineLatestは、すべての入力が少なくとも1つの値を生成するまで、何も発行しません。その後は、いずれかの入力が新しい値を発行するたびに、他の入力の最新値と組み合わせた出力を発行します。

zip

zipはインデックスで値を対応付けます。Aの1番目とBの1番目、2番目と2番目というように対応付け、各位置で両方に値が揃うまで待機します。

let names = ["Ann", "Bob", "Cy"].publisher
let ages = [30, 25, 41].publisher

names
    .zip(ages)
    .sink { name, age in
        print(name, "is", age)
    }
    .store(in: &cancellables)

combineLatestとzipの比較

この2つは混同しやすい演算子です。

  • combineLatest — いずれかの値が発行されると動作し、各入力の最新値を使用する
  • zip — インデックスで対応するペアが揃ったときだけ動作する

ライブ状態にはcombineLatestを、並列処理の結果を1対1で揃えるにはzipを使用します。

並列処理のために結合する

独立したリクエストを並列で実行し、すべての完了を待つ場合に、zipが力を発揮します。

fetchProfile
    .zip(fetchSettings)
    .sink { profile, settings in
        print("Both loaded")
    }
    .store(in: &cancellables)

演算子を連結する

実際のパイプラインでは、複数の演算子を連結して、複雑な非同期フローを宣言的に表現します。

searchTextPublisher
    .removeDuplicates()
    .flatMap { query in
        apiClient.search(query)
    }
    .map { results in
        results.prefix(10)
    }
    .sink { print($0) }
    .store(in: &cancellables)

理解度チェック

演算子についての知識を確認しましょう。

まとめ

ストリームを変換して結合する方法を学びました。

  • flatMap — 値をパブリッシャーへ変換して平坦化する
  • merge — 同じ型のストリームをインターリーブする
  • combineLatest — 各入力の最新値を使用し、いずれかの発行で動作する
  • zip — インデックスで対応付けたペアを作る

これらの演算子を使うと、複雑な非同期ロジックを宣言的に組み立てられます。

よくある質問

「ストリームの変換と結合」レッスンは無料ですか?

はい。「ストリームの変換と結合」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「ストリームの変換と結合」で何を学びますか?

flatMap、merge、combineLatest、zipを使用します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ストリームの変換と結合」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ストリームの変換と結合
  2. スケジューラーとスレッド処理
  3. エラー処理演算子
  4. カスタムPublisherとSubscriber
← Swift Academyに戻る