Я нашел способы объединить издателей с помощью MergeMany
или CombineLatest
, но, похоже, не нашел решения в моем конкретном случае.
Пример:
class Test {
@Published var firstNameValid: Bool = false
@Published var lastNameValid: Bool = false
@Published var emailValid: Bool = false
@Published var allValid: Bool = false
}
Я хочу, чтобы allValid
стал false
, когда любой из предыдущих издателей установлен на false
, и true
, если все они true
. Я также не хочу жестко кодировать список издателей, за которыми я наблюдаю, поскольку мне нужно гибкое решение, поэтому я хочу иметь возможность передавать массив Bool
издателей в любой код, который я использую для этого.
Я пробовал это
let fieldPublishers = [$firstNameValid, $lastNameValid, $emailValid]
Publishers
.MergeMany(fieldPublishers)
.sink { [weak self] values in
self?.allValid = values.allSatisfy { $0 }
}
.store(in: &subscribers)
Но это, конечно, не работает, потому что я получаю массив издателей, а не массив значений. Я пробовал другие способы (забыл, какие из них), но они, похоже, вызывали sink
только в том случае, если я присвоил значение во время выполнения всем трем издателям.
В случае использования только двух издателей мне удалось заставить его работать с помощью CombineLatest
.
Итак, вопрос: могу ли я активировать sink
, когда только один из издателей в массиве меняет значение после создания экземпляра Test
, а затем перебирать значения всех издателей, за которыми я наблюдаю?