问题
Is it possible to use the range operator ...
and ..<
with if statement. Maye something like this:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
回答1:
You can use the "pattern-match" operator ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
Or a switch-statement with an expression pattern (which uses the pattern-match operator internally):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Note that ..<
denotes a range that omits the upper value, so you probably want
200 ... 299
or 200 ..< 300
.
Additional information: When the above code is compiled in Xcode 6.3 with optimizations switch on, then for the test
if 200 ... 299 ~= statusCode
actually no function call is generated at all, only three assembly instruction:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
this is exactly the same assembly code that is generated for
if statusCode >= 200 && statusCode <= 299
You can verify that with
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
As of Swift 2, this can be written as
if case 200 ... 299 = statusCode {
print("success")
}
using the newly introduced pattern-matching for if-statements. See also Swift 2 - Pattern matching in "if".
回答2:
This version seems to be more readable than pattern matching:
if (200 ... 299).contains(statusCode) {
print("Success")
}
回答3:
This is an old thread, but it seems to me we're over-thinking this. It seems to me the best answer is just
if statusCode >= 200 && statusCode <= 299
There's no
if 200 > statusCode > 299
form that I'm aware of, and the other suggested solutions are doing function calls, which will be slower and are harder to read. The pattern match method is a useful trick to know, but seems like a poor fit for this problem
回答4:
I wanted to check 4xx errors except 401. Here is the code:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
回答5:
I preffered Range .contains() operator too, until found that its implementation is inefficient - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
We can represent the condition x < 0 using a range: (Int.min..<0).contains(x) is exactly equivalent. It is vastly slower, though. The default implementation of contains(_:) traverses the entire collection, and executing a loop nine quintillion times in the worst case is not cheap.
来源:https://stackoverflow.com/questions/24893110/can-i-use-the-range-operator-with-if-statement-in-swift