if let unwraps an optional only when it contains a value.

Unwrap when present

rawAge
optional_binding.swift
Replay: real traced execution (multi-file project)
let rawAge = "42"
let parsedAge = Int(rawAge)
var message = "missing"

if let age = parsedAge {
    message = "age=\(age)"
} else {
    message = "missing"
}

print(message)
let rawAge = "bad"
let parsedAge = Int(rawAge)
var message = "missing"

if let age = parsedAge {
    message = "age=\(age)"
} else {
    message = "missing"
}

print(message)
let rawAge = "17"
let parsedAge = Int(rawAge)
var message = "missing"

if let age = parsedAge {
    message = "age=\(age)"
} else {
    message = "missing"
}

print(message)
  1. rawAge ← 42, parsedAge ← Optional(42), message ← missing

    1let rawAge→ 42 = "42"  //@rawAge="bad", "17"2let parsedAge→ Optional(42) = Int(rawAge42)3var message→ missing = "missing"
  2. if let age = parsedAge

    5if let age42 = parsedAgeOptional(42) {6    message = "age=\(age42)"7} else {
  3. print(message)

    11print(messageage=42)
    outputage=42
  1. rawAge ← bad, parsedAge ← nil, message ← missing

    1let rawAge→ bad = "bad"2let parsedAge→ nil = Int(rawAgebad)3var message→ missing = "missing"
  2. print(message)

    11print(messagemissing)
    outputmissing
  1. rawAge ← 17, parsedAge ← Optional(17), message ← missing

    1let rawAge→ 17 = "17"2let parsedAge→ Optional(17) = Int(rawAge17)3var message→ missing = "missing"
  2. if let age = parsedAge

    5if let age17 = parsedAgeOptional(17) {6    message = "age=\(age17)"7} else {
  3. print(message)

    11print(messageage=17)
    outputage=17
if let Optional binding creates a non-optional constant inside the `if` branch. The `else` branch handles the missing-value case.