Jimmy Jimmy - 4 months ago 9
Swift Question

Can I use the range operator with if statement in Swift?

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")
}

Answer

You can use the "pattern-match" operator ~=:

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

Or a switch-statement with an expression pattern (which uses the pattern-match operator internally):

switch statusCode {
case 200 ... 299:
    println("success")
default:
    println("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".

Comments