map can transform the value inside an optional while preserving nil.

Transform when present

rawCount
optional_map.swift
Replay: real traced execution (multi-file project)
let rawCount = "6"
let count = Int(rawCount)
let doubled = count.map { value in
    return value * 2
}
let output = doubled == nil ? "missing" : "double=\(doubled!)"

print("rawCount=\(rawCount)")
print(output)
let rawCount = "bad"
let count = Int(rawCount)
let doubled = count.map { value in
    return value * 2
}
let output = doubled == nil ? "missing" : "double=\(doubled!)"

print("rawCount=\(rawCount)")
print(output)
let rawCount = "9"
let count = Int(rawCount)
let doubled = count.map { value in
    return value * 2
}
let output = doubled == nil ? "missing" : "double=\(doubled!)"

print("rawCount=\(rawCount)")
print(output)
  1. rawCount ← 6, count ← Optional(6), doubled ← Optional(12), output ← double=12

    1let rawCount→ 6 = "6"  //@rawCount="bad", "9"2let count→ Optional(6) = Int(rawCount6)3let doubled→ Optional(12) = countOptional(6).map { value in4    return value * 25}6let output→ double=12 = doubledOptional(12) == nil ? "missing" : "double=\(doubled!)"78print("rawCount=\(rawCount6)")9print(outputdouble=12)
    outputrawCount=6
    double=12
  1. rawCount ← bad, count ← nil, doubled ← nil, output ← missing

    1let rawCount→ bad = "bad"2let count→ nil = Int(rawCountbad)3let doubled→ nil = countnil.map { value in4    return value * 25}6let output→ missing = doublednil == nil ? "missing" : "double=\(doubled!)"78print("rawCount=\(rawCountbad)")9print(outputmissing)
    outputrawCount=bad
    missing
  1. rawCount ← 9, count ← Optional(9), doubled ← Optional(18), output ← double=18

    1let rawCount→ 9 = "9"2let count→ Optional(9) = Int(rawCount9)3let doubled→ Optional(18) = countOptional(9).map { value in4    return value * 25}6let output→ double=18 = doubledOptional(18) == nil ? "missing" : "double=\(doubled!)"78print("rawCount=\(rawCount9)")9print(outputdouble=18)
    outputrawCount=9
    double=18
optional map Optional `map` runs the closure only when the optional has a value. If the optional is `nil`, the mapped result is also `nil`.