Быстрое объединение: `first (_ n: Int)` эквивалентно RxSwift `take (_ n: Int)`? - PullRequest
0 голосов
/ 31 октября 2019

Мне нужен оператор 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.

1 Ответ

1 голос
/ 01 ноября 2019

В комбинате это называется prefix(_:). https://developer.apple.com/documentation/combine/publisher/3204737-prefix

...