PassthroughSubject는 Subject의 한 종류로, Passthrough 이름에서도 알 수 있듯 내부 상태를 유지하거나 저장하지 않아요.

기본적으로 이전에 설명한 Subject와 모든 특징을 공유하지만 다른점이 있어요

특징

사용

let subject = PassthroughSubject<String, Never>()

subject.sink(
    receiveCompletion: { completion in
        switch completion {
        case .finished:
            print("Completed")
        case .failure(let error):
            print("Failed with error: \\(error)")
        }
    },
    receiveValue: { value in
        print("Received value: \\(value)")
    }
)
.store(in: &cancellables)

subject.send("Hello")
subject.send(completion: .finished)

// 결과

Received value: Hello
Completed

일반적인 구독과 형태가 같죠?

하지만 PassthroughSubject는 구독 시점 이전에 발생한 값은 구독하지 않아요.

let subject = PassthroughSubject<String, Never>()

subject.send("Nice to meet you") // 구독전에 값을 날려보면? 

let subscription1 = subject.sink(
    receiveCompletion: { completion in
        switch completion {
        case .finished:
            print("Completed")
        case .failure(let error):
            print("Failed with error: \\(error)")
        }
    },
    receiveValue: { value in
        print("Received value: \\(value)")
    }
)

subject.send("Hello")
subject.send(completion: .finished)

// 결과

Received value: Hello
Completed

subject가 sink에 의해 구독되기 전이므로 발행한 “Nice to meet you” 는 구독되지 않은 모습이에요.