Para desenvolver un opcional y pasarlo a una función que normalmente uso:
var optionalInt: Int? optionalInt.map { someFunctionThatTakes(aNonOptional: $0) }Ahora tengo un error opcional que me gustaría lanzar si no es nulo:
var optionalError: Error? optionalError.map { throw $0 }Esto no funcionará porque el cierre pasado al mapa no se puede lanzar.
Una solución alternativa sería utilizar la sintaxis if let completa:
if let theError = optionalError { throw theError } Pero esto usa el nombre de variable theError dos veces y es más propenso a errores que la hermosa implementación .map .
¿Alguien sabe una forma más limpia de implementar esto?
Esto no funcionará porque el cierre pasado al mapa no se puede lanzar.
Eso no es cierto. El cierre pasó a
func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U? puede arrojar un error. Pero eso hace que map() se llame a sí mismo una expresión de (re)lanzamiento, por lo tanto, debe llamarse con try :
var optionalError: Error? // ... try optionalError.map { throw $0 }probablemente todavía usaría
if let theError = optionalError { throw theError } lo cual es muy claro y no usa Optional.map por sus efectos secundarios (¿descartando el valor de retorno de tipo Void? ).
si no usa el método try delante del mapa, dará error
La llamada puede lanzarse pero no está marcada con 'intentar'
En su lugar, use try para arrojar un error.
enum IntParsingError: Error { case overflow case invalidInput(String) } var optionalError: Error? = IntParsingError.overflow do { try optionalError.map { throw $0 } } catch { print(error) }También puede usar flatMap porque evalúa que la instancia opcional de cierre no es nula
optionalError.flatMap(throw $0)Pero aún así, If let sería la mejor manera de manejar el error opcional en lugar de map y flatMap.
Puedes crear una extensión para Swift.Error
extension Swift.Error { func throwIfNeeded() throws { throw self } }Y llamarlo en error opcional
try error?.throwIfNeeded()