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

Jim*_*mmy 177 if-statement range swift

是否可以使用范围运算符.....<if语句.Maye是这样的:

let statusCode = 204
if statusCode in 200 ..< 299 {
  NSLog("Success")
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 389

您可以使用"模式匹配"运算符~=:

if 200 ... 299 ~= statusCode {
    print("success")
}
Run Code Online (Sandbox Code Playgroud)

或者带有表达式模式的switch语句(在内部使用模式匹配运算符):

switch statusCode {
case 200 ... 299:
    print("success")
default:
    print("failure")
}
Run Code Online (Sandbox Code Playgroud)

注意,..<表示省略上限值的范围,因此您可能需要 200 ... 299200 ..< 300.

附加信息:当上述代码在Xcode 6.3中编译并且优化开启时,则进行测试

if 200 ... 299 ~= statusCode
Run Code Online (Sandbox Code Playgroud)

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

addq    $-200, %rdi
cmpq    $99, %rdi
ja  LBB0_1
Run Code Online (Sandbox Code Playgroud)

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

if statusCode >= 200 && statusCode <= 299
Run Code Online (Sandbox Code Playgroud)

您可以验证

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

从Swift 2开始,这可以写成

if case 200 ... 299 = statusCode {
    print("success")
}
Run Code Online (Sandbox Code Playgroud)

使用新引入的if语句模式匹配.另请参见Swift 2 - "if"中的模式匹配.

  • @Downvoter:一些解释评论会很好,所以我可以改进或修复答案...... (4认同)
  • @codester:我使用`xcrun -sdk macosx swift -emit-assembly main.swift`在命令行上编译代码并检查汇编代码.然后我使用`xcrun swift-demangle ...`来解除被调用函数的名称. - 不幸的是,Xcode还不能为Swift文件创建汇编代码,也许它可以在更高版本中运行. (3认同)
  • @Sky:从生成的汇编代码中可以看到库函数`func~ =(Range <A>,A) - > Bool`被调用.我会*假设*此函数与O(1)一起使用. (2认同)

Ser*_*nko 87

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

if (200 ... 299).contains(statusCode) {
    print("Success")
}
Run Code Online (Sandbox Code Playgroud)

  • 正是我要寻找的 (2认同)

Dun*_*n C 7

这是一个老线程,但在我看来,我们过度思考这个问题.在我看来,最好的答案就是

if statusCode >= 200 && statusCode <= 299
Run Code Online (Sandbox Code Playgroud)

没有

if 200 > statusCode > 299
Run Code Online (Sandbox Code Playgroud)

我知道的形式,其他建议的解决方案正在进行函数调用,这将更慢并且更难阅读.模式匹配方法是一个有用的技巧,但似乎不适合这个问题

  • 实际上`如果200 ... 299~ = statusCode`给出*相同*汇编代码为`if statusCode> = 200 && statusCode <= 299` (13认同)
  • 除非这个条件是在每秒访问数千次的关键部分,否则担心函数调用开销是过早优化.即便如此,我还会更担心函数调用*正在做什么*而不是调用它的成本.很棒的工作@MartinR无论如何都证明没有成本. (6认同)