Swift Combine: combineLatest() operator

KD Knowledge Diet
2 min readJan 29, 2023

In this article, let’s go ahead and take a look at another combining operator. combineLastest(). This operator is a little bit different. combineLatest() is basically going to combine two different publishers. The great thing is that both of those publishers can have different types. Do you know merge() operator? It’s also combining publishers but merge() requires publishers to have the same type.

combineLastest()’s return value,.

When you are using combineLatest(), what you are going to get as a sequence is tuple. The latest value from each of the publisher is combined together into a tuple.

let publisher1 = PassthroughSubject<Int, Never>()
let publisher2 = PassthroughSubject<String, Never>()
publisher1.combineLatest(publisher2)
.sink { // receiveValue ((Int, String) -> Void)
print($0, $1)
}
publisher1.send(0) // nothing works

I created two publishers with two different types. One is getting Integer and another is getting String. You are neither receiving Int nor String, but you are going to receive ((Int, String)) Tuple Value. So, when you send an event from publisher1 alone, it simply doesn’t work. You must have a pair of values from publisher1 and publisher2 when it’s your first time to publisher.

let publisher1 = PassthroughSubject<Int, Never>()
let publisher2 = PassthroughSubject<String, Never>()
publisher1.combineLatest(publisher2)
.sink { // receiveValue ((Int, String) -> Void)
print($0)
}
// You need to send a pair of values
publisher1.send(0)
publisher2.send("hello world")
// 0
// "hello world"
// After you first published a pair of values
// Now your publisher can get value when only one publisher
// sends an event
publisher1.send(1)
// 1

Like this, you must send a pair of values. Then, in sink(), you can receive the tuple. But after publishing the first tuple value with publisher1 and publisher2 , when you publisher a new value, left-side int is also passed down to the downstream.

More generally, the observable produced by combineLatest emits its first value when all the observables first emits a value, and subsequent values are emitted when any of the observables emits a value.

Conclusion

  • combineLatest() combine multiple publishers
  • combineLatest() returns tuple in the sink().
  • combineLatest() needs a paired event.

--

--

KD Knowledge Diet

Software Engineer, Mobile Developer living in Seoul. I hate people using difficult words. Why not using simple words? Keep It Simple Stupid!