是否可以将范围运算符...
和..<
与if语句一起使用。 Maye是这样的:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
答案 0 :(得分:351)
您可以使用“模式匹配”运算符~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
带有表达式模式的switch语句(使用模式匹配 内部运营商):
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语句模式匹配。 另请参阅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