有没有一种简单的方法来测试您是不是匹配一组枚举中的一个?

Posted

技术标签:

【中文标题】有没有一种简单的方法来测试您是不是匹配一组枚举中的一个?【英文标题】:Is there a simple way to test if you match one of a set of enumerations?有没有一种简单的方法来测试您是否匹配一组枚举中的一个? 【发布时间】:2016-11-15 04:10:16 【问题描述】:

考虑这段代码...

switch(testValue)

    case .ValueA,
         .ValueB,
         .ValueC:

        return 40

    default:

        return 0

现在,如果我只是检查单个枚举值,我可以这样做...

return (testValue == .ValueA)
    ? 40
    : 0;

但我想知道如何才能拥有像后者这样的东西,但要测试像前者这样的倍数,类似于这个伪代码......

return (testValue is in [.ValueA, .ValueB, .ValueC])
    ? 40
    : 0;

我知道我可以使用内联数组来做到这一点,就像这样......

return ([SomeEnum.ValueA, .ValueB, .ValueC].Contains(testValue))
    ? 40
    : 0;

...但我希望有更干净的东西。有吗?

【问题讨论】:

Swift 可以从您正在比较的变量中推断出类型,因此 return ([.ValueA, .ValueB, .ValueC].contains(testValue)) ? 40 : 0 就足够了。 你也不需要括号:return [.ValueA, .ValueB, .ValueC].contains(testValue) ? 40 : 0. 我觉得非常有趣的是,我们可以在 switch 语句 (case .ValueA, .ValueB, .ValueC: ...) 中为单个案例提供多个匹配项,而我们(据我所知)不能这样做对于 if case 模式匹配中的等效 case 模式匹配。我相信if case 模式匹配等同于switch 语句中的单个case 模式匹配(唯一的区别是switch 语句中的case 模式匹配会跟踪案例的详尽性switch 声明),有点好像我弄错了? @dfri 实际上我对 Apple 说了同样的话作为错误报告。我的例子是:“虽然case 1,3,5,7,9 是 switch 案例中的合法模式,但它不是 if 案例中的合法模式。应该是。这就是错误。”他们以“表现符合预期”为由将其关闭。 @matt 感谢您的观看,我明白了,并同意;文档中没有任何内容(据我发现)表明在这件事上应该是等价的(我能得到的最接近的是疯狂冗长,根本不是if case ...,if ([.ValueA, .ValueB, .ValueC].reduce(false) $0 || (testValue ~= $1) ) /* ... */ ) .谢谢! W.R.T. ninja-edit:另一方面,他们的回答不是很冗长...... 【参考方案1】:
extension SomeEnum 
    func isOneOf(values: Value...) -> Bool 
        return values.contains(self)
    

return testValue.isOneOf(.ValueA, .ValueB, .ValueC) ? 40 : 0

【讨论】:

以上是关于有没有一种简单的方法来测试您是不是匹配一组枚举中的一个?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新除该组中最新项目之外的一组行

有没有一种简单的方法来处理(转换)SkiaSharp 中的一组对象?

集合set的使用

多个 if-else 测试的更简单方法

复习系列之枚举

规范必备:枚举类型