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

时间:2014-07-22 16:42:11

标签: if-statement swift range

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

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

6 个答案:

答案 0 :(得分:351)

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

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

带有表达式模式的switch语句(使用模式匹配 内部运营商):

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

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

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

if 200 ... 299 ~= statusCode

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

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

这与为

生成的汇编代码完全相同
if statusCode >= 200 && statusCode <= 299

您可以使用

进行验证
xcrun -sdk macosx swiftc -O -emit-assembly main.swift

从Swift 2开始,这可以写成

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

使用新引入的if语句模式匹配。 另请参阅Swift 2 - Pattern matching in "if"

答案 1 :(得分:81)

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

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

答案 2 :(得分:8)

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

if statusCode >= 200 && statusCode <= 299

没有

if 200 > statusCode > 299

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

答案 3 :(得分:3)

我想检查除401之外的4xx错误。以下是代码:

let i = 401

if 400..<500 ~= i, i != 401 {
    print("yes")
} else {
    print("NO")
}

答案 4 :(得分:1)

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

  

我们可以表示条件x&lt; 0使用范围:   (Int.min ..&lt; 0).contains(x)完全相同。它慢得多,   虽然。 contains(_ :)的默认实现遍历   整个集合,并执行一个循环九个quintillion次   最糟糕的情况并不便宜。

答案 5 :(得分:0)

如果您想知道响应状态代码是否成功,只需以这种方式完成

  if response.statuscode < 300 {
      print("response is a success")
  }

如果您从200,201,203,204 ... 300进行迭代。则有太多不必要的迭代。希望这可以帮助! :D