是否可以将范围运算符 ...
和 ..<
与 if 语句一起使用。可能是这样的:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
您可以使用“模式匹配”运算符 ~=
:
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"。
这个版本似乎比模式匹配更具可读性:
if (200 ... 299).contains(statusCode) {
print("Success")
}
这是一个旧线程,但在我看来,我们对此考虑过度了。在我看来,最好的答案就是
if statusCode >= 200 && statusCode <= 299
没有
if 200 > statusCode > 299
我知道的形式,其他建议的解决方案是执行函数调用,这更难阅读,执行起来可能更慢。模式匹配方法是一个有用的技巧,但似乎不适合这个问题。
编辑:
就个人而言,我发现模式匹配运算符很可怕,并希望编译器支持 if x in 1...100
语法。这比 if 1...100 ~= x
更直观、更易于阅读
if 200 ... 299 ~= statusCode
生成了三个汇编指令,没有函数调用:)
if 200 ... 299 ~= statusCode
给出了 same 汇编代码作为 if statusCode >= 200 && statusCode <= 299
我想检查除 401 之外的 4xx 错误。这是代码:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
我也更喜欢 Range .contains() 运算符,直到发现它的实现效率低下 - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
我们可以使用一个范围来表示条件 x < 0: (Int.min..<0).contains(x) 是完全等价的。但是,它要慢得多。 contains(_:) 的默认实现会遍历整个集合,并且在最坏的情况下执行一个循环九 quintillion 次并不便宜。
如果您想知道响应状态码是否成功,只需这样
if response.statuscode < 300 {
print("response is a success")
}
如果您从 200,201,203,204 ... 300 进行迭代。不必要的迭代太多了。希望这可以帮助! :D
不定期副业成功案例分享
func ~= (Range<A>, A) -> Bool
。我会假设此函数适用于 O(1)。xcrun -sdk macosx swift -emit-assembly main.swift
编译了代码并检查了汇编代码。然后我使用xcrun swift-demangle ...
来消除被调用函数的名称。 - 不幸的是,Xcode 还不能为 Swift 文件创建汇编代码,也许它会在以后的版本中工作。