Как выполнить операцию «все» на произвольном количестве издателей Bool в Combine? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть ситуация, когда я пытаюсь определить, является ли произвольное число логических проверок (пользовательских условий) true. Это похоже на работу для CombineLatest в сочетании с AllSatisfy ... проблема в том, что CombineLatest поддерживает только фиксированное количество элементов (2, 3 или 4). Есть ли какой-то шаблон, кроме использования повторяющихся 2-элементных издателей CombineLatest, которые объединяют каждый результат с другим из издателей?

В идеале я хотел бы что-то вроде:

Publishers.CombineLatestMany(arrayOfPublishers).allSatisfy { ... }

, а не:

Publishers.CombineLatest(pubA, pubB).combineLatest(pubC).combineLatest(pubD) ...

1 Ответ

1 голос
/ 03 мая 2020

Это должно удовлетворить ваши потребности, если только ваши издатели не относятся к разным типам:

extension Publisher where Output == Bool {
    func and<P: Publisher>(_ rest: P...) -> some Publisher where P.Output == Output, P.Failure == Failure {
        rest.reduce(AnyPublisher(self)) { acc, next in
            AnyPublisher(acc.combineLatest(next).map { $0 && $1 })
        }
    }
}
...