在swift中,抛出可选错误的最干净方式是什么?
要展开可选项并将其传递给我通常使用的函数,请执行以下操作:在swift中,抛出可选错误的最干净方式是什么?,swift,try-catch,optional,throws,Swift,Try Catch,Optional,Throws,要展开可选项并将其传递给我通常使用的函数,请执行以下操作: var optionalInt: Int? optionalInt.map { someFunctionThatTakes(aNonOptional: $0) } 现在我有一个可选错误,如果不是nil,我想抛出它: var optionalError: Error? optionalError.map { throw $0 } 这将不起作用,因为传递给map的闭包无法抛出 另一种解决方案是使用完整的if let语法: if le
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 }
但是它使用变量名两次出错
,并且比漂亮的.map
实现更容易出错
有人知道一种更干净的方法来实现这一点吗
这将不起作用,因为传递给map的闭包无法抛出
那不是真的。停业时间已过去
func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?
我可能仍然会使用
if let theError = optionalError { throw theError }
这是非常清楚的,并且没有使用
可选.map作为其副作用(丢弃类型Void?
的返回值)。如果不使用在map方法前面尝试,它将给出错误
呼叫可以抛出,但未标记“尝试”
使用尝试实际抛出错误。
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)
但是,If-let仍然是处理可选错误的最佳方法
而不是地图和平面地图
您可以为Swift.Error创建扩展名
extension Swift.Error {
func throwIfNeeded() throws {
throw self
}
}
并在可选错误时调用它
try error?.throwIfNeeded()
在地图说明前使用try。我建议您使用if-let和guard-let进行可选处理。漂亮。地图?我认为可选的展开要好得多。你怎么会出现可选的错误呢?看起来有点奇怪。
try error?.throwIfNeeded()