[英]Swift Combine: How to specify the Error type of tryMap(_:)?
在 Combine 框架中,我們可以在使用tryMap
拋出一個通用的Error
協議類型。
但是,我們如何才能更具體地了解Error
類型?
例如,
let publisher = urlSession.dataTaskPublisher(for: request).tryMap { (data, response) -> (Data, HTTPURLResponse) in
guard let response = response as? HTTPURLResponse else {
throw URLError(.cannotParseResponse)
}
return (data, response)
}
如何指定此publisher
的Error
類型? 我想使用URLError
而不是Error
。
我在Combine
框架中找到了setFailureType(to:)
方法。 但是,它不適用於tryMap(_:)
。
setFailureType(to:)
只是強制失敗類型為Never
的發布者的失敗類型。 tryMap
總是使用Error
作為錯誤類型,因為任何Error
都可能在閉包體中拋出,因此您需要使用mapError
強制使用URLError
類型:
let map_error = publisher.mapError({ error -> URLError in
switch (error) {
case let url_error as URLError:
return url_error
default:
return URLError(.unknown)
}
})
您也可以使用flatMap
完成此操作。 這將允許您同時指定Output
和Error
類型,如下所示:
struct SomeResponseType {
let data: Data
let response: HTTPURLResponse
}
let publisher = urlSession.dataTaskPublisher(for: request)
.flatMap { (data, response) -> AnyPublisher<SomeResponseType, URLError > in
guard let response = response as? HTTPURLResponse else {
return Fail(error: URLError(.cannotParseResponse))
.eraseToAnyPublisher()
}
return Just(SomeResponseType(data: data, response: response)
.setFailureType(to: URLError)
.eraseToAnyPublisher()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.