Swift 带有关联值的枚举的捕获中的快速模式匹配

Swift 带有关联值的枚举的捕获中的快速模式匹配,swift,pattern-matching,try-catch,Swift,Pattern Matching,Try Catch,我想弄清楚如何对catch中具有错误类型的关联value属性的枚举进行模式匹配。对于没有关联值的枚举,一切都按预期工作,但我似乎无法找出适合这种情况的正确模式 结构MyError:错误{ 枚举大小{ 大箱子,小箱子 } 枚举解{ 案件失控 大小写字符串 } 让大小:大小 让解决方案:解决方案 } 函数作用{ 做{ // ... } 将let错误捕获为MyError,其中error.size==.big{ //这很好,因为'size'没有关联的值。 } 将let错误捕获为MyError,其中err

我想弄清楚如何对catch中具有错误类型的关联value属性的枚举进行模式匹配。对于没有关联值的枚举,一切都按预期工作,但我似乎无法找出适合这种情况的正确模式

结构MyError:错误{ 枚举大小{ 大箱子,小箱子 } 枚举解{ 案件失控 大小写字符串 } 让大小:大小 让解决方案:解决方案 } 函数作用{ 做{ // ... } 将let错误捕获为MyError,其中error.size==.big{ //这很好,因为'size'没有关联的值。 } 将let错误捕获为MyError,其中error.solution==.other{ //我想在这里处理'Solution.other'的所有情况,而不考虑关联的值。 } 抓住{ // ... } } 由于带有关联值的枚举,第二个catch模式无法按预期编译。实现这一点的通常方法是if case.runAway=error.solution{…},但将其集成到catch模式中是个问题

我尝试了许多if-case/let-case/case-let的组合,但在单个catch模式匹配语句中无法实现。考虑到模式匹配的功能和灵活性,这似乎是可能的,所以我希望我忽略了一些东西


谢谢你的帮助

在您的示例中,有两件事需要解决:

比较枚举的情况应该是公平的,不是吗?对于这样一个简单的枚举,只需将解决方案标记为“公平”

未处理捕获的默认情况,因此您需要添加它,例如:

做{ ... } 将let错误捕获为MyError,其中error.size==.big{ //这可以正常工作,因为assize没有关联的值。 } 将let错误捕获为MyError,其中error.solution==.runAway{ //我想完成这个比较。 } 捕捉错误{ ... }


这感觉是可能的,但不是:/。您尝试使用的是枚举案例模式。根据,枚举大小写模式仅允许在switch、if、while、guard和for语句中使用

您可以在解决方案中添加isOther属性:

然后将其用于捕获:

do {
    // ...
}
catch let error as MyError where error.size == .big {
    // ...
}
catch let error as MyError where error.solution.isOther {
    // ...
}
catch {
   // ...
} 

谢谢符合Equatable允许匹配.runAway,但仍然不允许与包含关联值的.other案例进行比较。是的,这是预期行为,您仍然可以将案例与关联值进行比较,例如:error.solution=.othersome string,因为将枚举标记为生成的默认比较函数。如果只想比较没有关联值的情况,只需实现一个自定义比较函数static func==lhs:Solution,rhs:Solution->Bool{switch lhs,rhs{case.runAway,.runAway:return true case.other,.other:return true默认值:return false}并将catch-let-error添加为MyError,其中error.solution==.other然后感谢您的文档引用!catch语句中不支持这一点的确认正是我希望找到的。
do {
    // ...
}
catch let error as MyError where error.size == .big {
    // ...
}
catch let error as MyError where error.solution.isOther {
    // ...
}
catch {
   // ...
}