Optional binding and where clauses

suggest change

Optionals must be unwrapped before they can be used in most expressions. if let is an optional binding, which succeeds if the optional value was not nil:

let num: Int? = 10 // or: let num: Int? = nil

if let unwrappedNum = num {
    // num has type Int?; unwrappedNum has type Int
    print("num was not nil: \(unwrappedNum + 1)")
} else {
    print("num was nil")
}

You can reuse the same name for the newly bound variable, shadowing the original:

// num originally has type Int?
if let num = num {
    // num has type Int inside this block
}

Combine multiple optional bindings with commas (,):

if let unwrappedNum = num, let unwrappedStr = str {
    // Do something with unwrappedNum & unwrappedStr
} else if let unwrappedNum = num {
    // Do something with unwrappedNum
} else {
    // num was nil
}

Apply further constraints after the optional binding using a where clause:

where unwrappedNum % 2 == 0

If you’re feeling adventurous, interleave any number of optional bindings and where clauses:

if let num = num                           // num must be non-nil
    where num % 2 == 1,                    // num must be odd
    let str = str,                         // str must be non-nil
    let firstChar = str.characters.first   // str must also be non-empty
    where firstChar != "x"                 // the first character must not be "x"
{
    // all bindings & conditions succeeded!
}

In Swift 3, where clauses have been replaced (SE-0099): simply use another , to separate optional bindings and boolean conditions.

, unwrappedNum % 2 == 0

Feedback about page:

Feedback:
Optional: your email if you want me to get back to you:



Table Of Contents