要解开一个可选包并将其传递给我通常使用的函数:
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()