Ios Swift Combine:如何指定tryMap(:)的错误类型?

Ios Swift Combine:如何指定tryMap(:)的错误类型?,ios,swift,xcode,macos,combine,Ios,Swift,Xcode,Macos,Combine,在Combine框架中,我们可以在使用tryMap时抛出一个通用的错误协议类型 但是,我们如何更具体地描述错误类型 比如说, let publisher=urlSession.dataTaskPublisher(for:request).tryMap{(数据,响应)->(数据,HTTPURLResponse)位于 guard let response=响应为?HTTPURLResponse else{ 抛出URL错误(.cannotParseResponse) } 返回(数据、响应) } 如何

在Combine框架中,我们可以在使用
tryMap
时抛出一个通用的
错误
协议类型

但是,我们如何更具体地描述
错误
类型

比如说,

let publisher=urlSession.dataTaskPublisher(for:request).tryMap{(数据,响应)->(数据,HTTPURLResponse)位于
guard let response=响应为?HTTPURLResponse else{
抛出URL错误(.cannotParseResponse)
}
返回(数据、响应)
}
如何指定此
发布者的
错误类型
?我想使用
urleror
而不是
Error

我在
Combine
框架中找到了方法
setFailureType(to:)
。但是,它不可用于
tryMap(:)
设置故障类型(to:)
仅用于强制发布者的故障类型为故障类型
从不
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)
    }
})

很好的解释,但是为什么
error.self
在这里而不仅仅是
error
?纯粹是样式,但这可能更简单,因为
mapError{$0 as?URLError??URLError(.unknown)}
。很好,我有一个以前的解决方案,开关检查类型,而不是使用
case let
,这确实需要
error.self
。做了更改却忘了更改。是的,如果你只是检查一种类型,你的表格会更简洁。