Ios Swift Combine:如何指定tryMap(:)的错误类型?
在Combine框架中,我们可以在使用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) } 返回(数据、响应) } 如何
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
。做了更改却忘了更改。是的,如果你只是检查一种类型,你的表格会更简洁。