Optionals
Optional Binding
if let unwraps an optional only when it contains a value.
Unwrap when present
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)
rawAge ← 42, parsedAge ← Optional(42), message ← missing
1let rawAge→ 42 = "42" //@rawAge="bad", "17"2let parsedAge→ Optional(42) = Int(rawAge42)3var message→ missing = "missing"if let age = parsedAge
5if let age42 = parsedAgeOptional(42) {6 message = "age=\(age42)"7} else {print(message)
11print(messageage=42)outputage=42
rawAge ← bad, parsedAge ← nil, message ← missing
1let rawAge→ bad = "bad"2let parsedAge→ nil = Int(rawAgebad)3var message→ missing = "missing"print(message)
11print(messagemissing)outputmissing
rawAge ← 17, parsedAge ← Optional(17), message ← missing
1let rawAge→ 17 = "17"2let parsedAge→ Optional(17) = Int(rawAge17)3var message→ missing = "missing"if let age = parsedAge
5if let age17 = parsedAgeOptional(17) {6 message = "age=\(age17)"7} else {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.