捕获带有绑定的Swift枚举案例

4
如果出现自定义错误:
enum MyError: Error {
  case error1
  case error2
}

我可以捕获所有这种类型的错误并绑定变量:
do {
} catch let e as MyError {
} catch {
  // everything else
}

我可以捕获特定错误而无需绑定变量

do {
} catch MyError.error1 {
} catch {
  // everything else, including MyError.error2
}

但是我如何捕获特定错误并绑定变量?


1
你想要实现什么并不清楚。 - Joakim Danielson
2个回答

5
如果我理解正确,您希望在 catch 内部的变量是特定类型错误的特定错误情况。
如果是这样,您可以这样做:
do {
    try something()
} catch let err1 as MyError where err1 == .error1 {
    print(err1)
} catch {
    print(error)
}

在实际使用中,这与 } catch MyError.error1 { 有何不同? - Joakim Danielson
@JoakimDanielson,我认为可能存在多个错误匹配 where err.rawValue > 3 的用例,这时它可能有些有用。当我回复时,并没有考虑这是否是真实情况 :) - New Dev
@JoakimDanielson 如果您想在块内处理错误但不想复制 MyError.error1 代码,则此方法非常有用。 - Max

0

我认为你需要的是以下内容:

    do {
        throw(MyError.error2)
    } catch let error as MyError {
        switch error {
        case .error1:
            print("error 1 happened")
            return
        case .error2:
            print("error 2 happened")
            return
        }
    } catch let error {
        print(error)
        return
    }

抱歉,我稍微编辑了一下我的问题。我想在最后加一个 catch-all,所以你的方法会强制我在 .error2 情况下复制那段代码。或者有没有办法从 .error2 跳到 catch-all? - Max
我认为它不会强制您复制代码。因为MyError类型首先在第一个catch块中处理,所以通用部分不会运行。 - SalDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接