Как в Combine устроены ошибки: Failure, catch, retry и почему поток умирает?
Суть
У каждого Publisher есть тип Failure, и ошибка в Combine — это не значение, а завершение: .failure(error) — последнее событие потока, после него издатель не пришлёт ничего, а подписка освобождается. Поэтому одна сетевая ошибка внутри цепочки «убивает» её навсегда: пользователь жмёт «Обновить», а запросы больше не уходят.
Операторы обработки ошибок не «чинят» исходный поток — они его заменяют. catch переключается на запасной издатель, replaceError(with:) отдаёт одно значение и завершается, retry(n) заново подписывается на upstream (для холодного издателя это повторный запрос).
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep