如何表达"不等于"使用带有元组模式匹配的Swift开关语句

时间:2016-12-01 21:23:29

标签: swift

我试图在带有元组的switch语句中使用模式匹配来清楚地表达枚举不等于一个特定情况的所有情况。这是我的switch语句的缩短版本:

switch (source, type, status) {
        case (.cashVoucher, _, .awaitingValidation):
            return cashVoucherAwaitingValidationMessageComponants
        case (.cashVoucher, _, != .awaitingValidation):
            return validatedCashVoucherMessageComponants
        default:
            fatalError("")
        }

这显然不能正确编译!=运算符的错误使用,但它可以让您了解我想要实现的目标。

我希望第一个案例与.cashVoucher的来源和.awaitingValidation的状态匹配。

我希望第二个案例与来源.cashVoucher以及除.awaitingValidation之外的任何状态相匹配。

到目前为止,我可以想到两种解决方案,但它们并不像我想的那样可读。我可以简单列出所有其他状态案例,但总共有8个并且变得难以阅读。 Alernativly,我可以使用案例case (.cashVoucher, _, _):,由于交换机案例的顺序,它会做我想要实现的,但我的switch语句总共有16个案例,并依赖于在我看来,开关盒让读者更难理解。

那么有什么方法可以使用与我上面的!= .awaitingValidation类似的东西来表达这一点吗?

1 个答案:

答案 0 :(得分:4)

你应该能够把它写成:

switch (source, type, status) {
case (.cashVoucher, _, let st) where st == .awaitingValidation:
    return cashVoucherAwaitingValidationMessageComponants
case (.cashVoucher, _, let st) where st != .awaitingValidation:
    return validatedCashVoucherMessageComponants
default:
    fatalError("")
}

因此,将元组的第三个值赋给常量(此处为st),并使用where检查是否相等。