Optionals
Optional Map
map can transform the value inside an optional while preserving nil.
Transform when present
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)
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
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
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`.