ストリームの変換と結合
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フィードバックを取得できます。ローカル設定は不要です。