我可以在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 ... 299
或200 ..< 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(_ :)的默认实现遍历整个集合,并且在最坏的情况下执行一个循环九个十亿次并不便宜。