【发布时间】: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:另一方面,他们的回答不是很冗长......
标签: swift conditional-operator ternary