Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在swift中,抛出可选错误的最干净方式是什么?_Swift_Try Catch_Optional_Throws - Fatal编程技术网

在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()