是否可以使用范围操作符…和. .< with if语句。可能是这样的:

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

当前回答

这是一个老话题,但在我看来我们想太多了。在我看来,最好的答案是

if statusCode >= 200 && statusCode <= 299

没有

if 200 > statusCode > 299

其他建议的解决方案是进行函数调用,这更难读懂,而且可能执行得更慢。模式匹配方法是一个很有用的技巧,但似乎不太适合这个问题。

编辑:

就我个人而言,我发现模式匹配操作符是可怕的,并希望编译器能够支持如果x在1…100年的语法。这是非常非常直观和容易阅读比如果1…100 ~= x

其他回答

这是一个老话题,但在我看来我们想太多了。在我看来,最好的答案是

if statusCode >= 200 && statusCode <= 299

没有

if 200 > statusCode > 299

其他建议的解决方案是进行函数调用,这更难读懂,而且可能执行得更慢。模式匹配方法是一个很有用的技巧,但似乎不太适合这个问题。

编辑:

就我个人而言,我发现模式匹配操作符是可怕的,并希望编译器能够支持如果x在1…100年的语法。这是非常非常直观和容易阅读比如果1…100 ~= x

你可以使用“模式匹配”操作符~=:

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

或者是带有表达式模式(使用模式匹配)的开关语句 运营商内部):

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

注意..<表示省略上值的范围,因此您可能需要 200年……299或200 ..< 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-statement模式匹配。 参见Swift 2 -“if”中的模式匹配。

我想检查4xx个错误,除了401。代码如下:

let i = 401

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

如果您想知道响应状态代码是否成功,只需这样做即可

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

如果你从200,201,203,204…300. 有太多不必要的迭代。希望这能有所帮助!: D

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

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