Я использую Combine, чтобы написать простой веб-скребок. Я пытаюсь отобразить возвращенные данные в строку HTML, выбрасывая ScraperError
s в каждой возможной точке отказа. В конце я хочу передать эту строку моему htmlSubject
, который является PassthroughSubject<String, ScraperError>
, для дальнейшей обработки.
urlSubscription = URLSession.shared
.dataTaskPublisher(for: url)
.mapError { _ -> ScraperError in // Explicitly stating my failure type is ScraperError
ScraperError.unreachableSite
}
.tryMap { (data, response) -> String in
guard let html = String(data: data, encoding: .utf8) else {
throw ScraperError.readFailed
}
return html
}
.subscribe(htmlSubject) // <-- Not allowed because failure type is now Error
Однако я обнаружил, что .tryMap
стирает мой * От 1008 * до обычного Error
, не позволяя мне связать мои htmlSubject
до конца:
Метод экземпляра «подписка» требует, чтобы типы «Ошибка» и «ScraperError» были эквивалентны.
Есть ли очевидный способ обойти это, что я упускаю, или меня сбивают с толку концептуально? Я думаю об этой цепочке как о строительных блоках в большой функции, которая отображает <(Data, URLResponse), URLError>
на <String, ScraperError>
.
Любая помощь приветствуется.