0Pricing
Swift Academy · レッスン

PassthroughSubjectとCurrentValueSubject

Subjectを命令型コードとCombineパイプラインの橋渡しとして使用します。

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

ようこそ

SubjectはPublisherとSubscriberの両方として機能します。命令型コードとリアクティブなCombineパイプラインを橋渡しします。

PassthroughSubject

```swift let subject = PassthroughSubject() subject.sink { print($0) }.store(in: &cancellables) subject.send("Hello") subject.send("World") // Hello, World ``` 後から購読を開始したSubscriberは、すでに送信された値を受け取れません。

CurrentValueSubject

```swift let subject = CurrentValueSubject(0) subject.sink { print($0) }.store(in: &cancellables) // prints 0 immediately subject.value = 1 // prints 1 subject.value = 2 // prints 2 ``` 現在の値を保存し、新しいSubscriberに再送します。

PassthroughSubjectとCurrentValueSubjectの比較

• `PassthroughSubject` — 値を保存しないため、後から購読を開始したSubscriberには何も届きません • `CurrentValueSubject` — 最新の値を保存するため、後から購読を開始したSubscriberもすぐに値を受け取れます

完了を送信する

```swift subject.send(completion: .finished) // or: subject.send(completion: .failure(MyError.bad)) ``` 完了した後は、これ以上値を送信できません。

Publisherとして使用する

```swift let events: AnyPublisher = subject.eraseToAnyPublisher() // Expose only the Publisher interface, hide Subject ```

Delegateから橋渡しする

```swift class LocationManager: NSObject, CLLocationManagerDelegate { let locationSubject = PassthroughSubject() func locationManager(_ m: CLLocationManager, didUpdateLocations l: [CLLocation]) { locationSubject.send(l.last!) } } ```

スレッドセーフティ

Subjectはデフォルトではスレッドセーフではありません。一貫したスレッドから値を送信するか、`receive(on:)`を使って切り替えてください。

Subjectを使ったテスト

```swift func testSearch() { let subject = PassthroughSubject() var results: [String] = [] subject.sink { results.append($0) }.store(in: &cancellables) subject.send("swift"); subject.send("ios") XCTAssertEqual(results, ["swift","ios"]) } ```

MVVMでCombineを使う

```swift class SearchViewModel: ObservableObject { let querySubject = CurrentValueSubject("") @Published var results: [String] = [] init() { querySubject .debounce(for: 0.3, scheduler: RunLoop.main) .flatMap { search($0) } .assign(to: &$results) } } ```

確認問題

新しいSubscriberに現在の値を再送するSubjectはどれですか?

まとめ

重要なポイント: • `PassthroughSubject` — 値を保存せず、再送もしません • `CurrentValueSubject` — 値を保存し、後から購読を開始したSubscriberに再送します • `send(completion:)`でストリームを終了します • `eraseToAnyPublisher()`でSubjectのインターフェースを隠します • Subjectは命令型コードとリアクティブコードを橋渡しします 次はCombineを使ったネットワーキングです。

よくある質問

「PassthroughSubjectとCurrentValueSubject」レッスンは無料ですか?

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

「PassthroughSubjectとCurrentValueSubject」で何を学びますか?

Subjectを命令型コードとCombineパイプラインの橋渡しとして使用します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「PassthroughSubjectとCurrentValueSubject」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. パブリッシャーとサブスクライバー
  2. オペレーター:map、filter、combineLatest
  3. PassthroughSubjectとCurrentValueSubject
  4. CombineとURLSessionによるネットワーキング
← Swift Academyに戻る