我可以限制函数在Swift中抛出的类型吗?

时间:2016-09-21 13:33:25

标签: swift swift3

在Swift 3中调用一个throws的函数时,你必须尽可能详尽地捕获所有可能的错误,这通常意味着你在最后有一个不必要的额外catch {}来处理赢得的错误&# 39; t发生。

是否可以说throws MyErrorType以便编译器在处理该枚举中的所有案例时都知道您确实已经详尽无遗了?

2 个答案:

答案 0 :(得分:5)

没有简单的方法可以使用抛出的错误来保证类型安全。考虑一下,如果编译器允许你指定throws MyErrorType,那么它还必须在该函数体内确保你不是try一个可能在一个不同的类型之外抛出一个不同类型的函数。做/捕获块。 (好吧,但它会增加不必要的复杂性)。在推断类型时,Swift编译器可能已经很慢并且陷入循环,推断投掷函数链中的抛出类型可能是一场噩梦。

正在运行的想法是,对于大多数错误,无论如何,你将以一小部分方式处理它们。

话虽如此,你不需要添加额外的catch let error as MyErrorType子句,你可以简单地在catch块中使用一个开关,如下所示:

do {
  try something()
} catch let e {
  switch e {
  case let m as MyErrorType: handleMyError(m)
  case let o as OtherErrorType: handleOther(o)
  case is ThirdErrorType: print("error \(e)")
  default: handleElse(e)
  }
}

答案 1 :(得分:2)

我对这个问题的建议是,不要在函数中返回Result类型,而是抛出错误。就像这样。

enum MyCustomError: Error {
    case genericError
}

func operationThatFails() -> Result<Response, MyCustomError> {
    guard requiredConsition() else {
        return .failure(.genericError)
    }
    return Response()
}

然后您可以像这样处理错误:

let result = operationThatFails()
switch result {
case .success(let value):
    // handle success
case .failure(let error):
    // handle error
}

这样,您的错误始终是安全键入的