swift 中抛出可选错误的最干净方法是什么



要解开一个可选包并将其传递给我通常使用的函数:

var optionalInt: Int?
optionalInt.map { someFunctionThatTakes(aNonOptional: $0) }

现在我有一个可选错误,如果它不是 nil,我想抛出它:

var optionalError: Error?
optionalError.map { throw $0 }

这不起作用,因为传递给 map 的闭包无法抛出。

另一种解决方案是使用完整的if let语法:

if let theError = optionalError { throw theError }

但是这使用变量名theError两次,并且比漂亮的.map实现更容易出错。

有谁知道更清洁的方法来实现这一点?

这不起作用,因为传递给 map 的闭包无法抛出。

那不是真的。关闭传递给

func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?

可能会引发错误。但这会使map()称自己为(重新)抛出表达式,因此必须使用 try 调用它:

var optionalError: Error?
// ...
try optionalError.map { throw $0 }

我可能仍然会使用

if let theError = optionalError { throw theError }

这很清楚,并且不使用Optional.map来产生副作用(丢弃类型Void?的返回值)。

如果你不在map方法前面使用try,它会给出错误

调用可以抛出,但未标有"try"

相反,请使用try实际引发错误。

enum IntParsingError: Error {
    case overflow
    case invalidInput(String)
}
var optionalError: Error? = IntParsingError.overflow
   do {
    try optionalError.map { throw $0 }
   } catch {
     print(error)
   }

您也可以使用 flatMap,因为它评估闭包可选实例不是 nil

optionalError.flatMap(throw $0)

但是,如果让将是处理可选错误的最佳方法 而不是地图和平面地图。

你可以为 Swift.Error 创建扩展

extension Swift.Error {
   func throwIfNeeded() throws {
       throw self
   }
}

并在可选错误时调用它

try error?.throwIfNeeded()

相关内容

最新更新