有没有一种简单的方法来测试您是不是匹配一组枚举中的一个?
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
【讨论】:
以上是关于有没有一种简单的方法来测试您是不是匹配一组枚举中的一个?的主要内容,如果未能解决你的问题,请参考以下文章