Generic helpers can work with optional values without knowing their concrete type ahead of time.

Replace nil with a default

hasNickname
generic_optionals.swift
Replay: real traced execution (multi-file project)
func valueOrDefault<T>(_ value: T?, fallback: T) -> T {
    return value ?? fallback
}

let hasNickname = true
let nickname = hasNickname ? "Ada" : nil
let display = valueOrDefault(nickname, fallback: "guest")
let message = "name=\(display)"

print(message)
func valueOrDefault<T>(_ value: T?, fallback: T) -> T {
    return value ?? fallback
}

let hasNickname = false
let nickname = hasNickname ? "Ada" : nil
let display = valueOrDefault(nickname, fallback: "guest")
let message = "name=\(display)"

print(message)
  1. hasNickname ← true, nickname ← Optional("Ada")

    5let hasNickname→ true = true  //@hasNickname=false6let nickname→ Optional("Ada") = hasNicknametrue ? "Ada" : nil7let display = valueOrDefault(nicknameOptional("Ada"), fallback: "guest")8let message = "name=\(display)"
  2. func valueOrDefault<T>(_ value: T?, fallback: T) -> T

    1func valueOrDefault<T>(_ valueOptional("Ada"): T?, fallbackguest: T) -> T {2    return valueOptional("Ada") ?? fallbackguest3}
  3. display ← Ada, message ← name=Ada

    6let nickname = hasNickname ? "Ada" : nil7let display→ Ada = valueOrDefault(nicknameOptional("Ada"), fallback: "guest")8let message→ name=Ada = "name=\(displayAda)"910print(messagename=Ada)
    outputname=Ada
  1. hasNickname ← false, nickname ← nil

    5let hasNickname→ false = false6let nickname→ nil = hasNicknamefalse ? "Ada" : nil7let display = valueOrDefault(nicknamenil, fallback: "guest")8let message = "name=\(display)"
  2. func valueOrDefault<T>(_ value: T?, fallback: T) -> T

    1func valueOrDefault<T>(_ valuenil: T?, fallbackguest: T) -> T {2    return valuenil ?? fallbackguest3}
  3. display ← guest, message ← name=guest

    6let nickname = hasNickname ? "Ada" : nil7let display→ guest = valueOrDefault(nicknamenil, fallback: "guest")8let message→ name=guest = "name=\(displayguest)"910print(messagename=guest)
    outputname=guest
optional generic A generic optional helper can express fallback behavior once and keep the returned type precise.