我可以在Swift中用if语句使用范围运算符吗?

是否有可能使用范围运算符.....<如果语句。 Maye这样的事情:

 let statusCode = 204 if statusCode in 200 ..< 299 { NSLog("Success") } 

你可以使用“模式匹配”运算符~=

 if 200 ... 299 ~= statusCode { print("success") } 

或者使用expression式模式(在内部使用模式匹配运算符)的switch-statement:

 switch statusCode { case 200 ... 299: print("success") default: print("failure") } 

请注意, ..<表示省略了上限值的范围,所以您可能需要200 ... 299200 ..< 300

附加信息:当上面的代码在Xcode 6.3中编译时,优化打开,然后进行testing

 if 200 ... 299 ~= statusCode 

实际上根本没有生成函数调用,只有三个汇编指令:

 addq $-200, %rdi cmpq $99, %rdi ja LBB0_1 

这与为其生成的汇编代码完全相同

 if statusCode >= 200 && statusCode <= 299 

你可以用来validation

 xcrun -sdk macosx swiftc -O -Omit-assembly main.swift

从Swift 2开始,这可以写成

 if case 200 ... 299 = statusCode { print("success") } 

使用新引入的用于if语句的模式匹配。 另请参见Swift 2 – “if”中的模式匹配 。

这个版本似乎比模式匹配更可读:

 if (200 ... 299).contains(statusCode) { print("Success") } 

这是一个古老的线索,但在我看来,我们正在过度思考这一点。 在我看来,最好的答案就是

 if statusCode >= 200 && statusCode <= 299 

没有

 if 200 > statusCode > 299 

forms,我知道,其他build议的解决scheme正在做function调用,这将是更慢,更难以阅读。 模式匹配方法是一个有用的技巧要知道,但似乎不适合这个问题

我也提供了Range.contains()运算符,直到发现它的实现是低效的 – https://oleb.net/blog/2015/09/swift-ranges-and-intervals/

我们可以使用范围来表示条件x <0:(Int.min .. <0).contains(x)是完全等价的。 不过,速度要慢得多。 contains(_ :)的默认实现遍历整个集合,并且在最坏的情况下执行一个循环九个十亿次并不便宜。