Мне нужен оператор Combine, аналогичный RxSwift take(_ n: Int)
, я написал это и, похоже, работает:
first(_ n)
реализация
public extension Publisher where Failure == Never {
/// Publishes the first `n` elements of a stream, then finishes.
func first(_ numberOfElements: Int) -> AnyPublisher<Output, Failure> {
collect(numberOfElements) // "Buffer"
.first() // "release and complete (finish)"
// Publisher<[Output]> -> Publisher<Output>
.map { $0.publisher }.switchToLatest()
.eraseToAnyPublisher()
}
}
Альтернативное решение?
Или вы можете придумать альтернативное решение, которое даже лучше?
take
(но я назвал его first
, чтобы отразить собственный оператор Combine first
- "Публикует первый элемент потока, затем завершает." ) Оператор действительно удобен при написании тестов, когда я хочу, чтобы Publisher заканчивал работу только после элементов n
.