Optional chaining calls a property or method only when the optional contains an instance.

Read through an optional

useProfile
optional_chaining.swift
Replay: real traced execution (multi-file project)
struct Profile {
    let name: String
}

let useProfile = true
let profile: Profile? = useProfile ? Profile(name: "Rin") : nil
let nameLength = profile?.name.count
let label = nameLength == nil ? "missing" : "length=\(nameLength!)"

print("useProfile=\(useProfile)")
print(label)
struct Profile {
    let name: String
}

let useProfile = false
let profile: Profile? = useProfile ? Profile(name: "Rin") : nil
let nameLength = profile?.name.count
let label = nameLength == nil ? "missing" : "length=\(nameLength!)"

print("useProfile=\(useProfile)")
print(label)
  1. useProfile ← true, profile ← Optional(main.Profile(name: "Rin"))

    5let useProfile→ true = true  //@useProfile=false6let profile→ Optional(main.Profile(name: "Rin")): Profile? = useProfiletrue ? Profile(name: "Rin") : nil7let nameLength→ Optional(3) = profile?.name.countOptional(3)8let label→ length=3 = nameLengthOptional(3) == nil ? "missing" : "length=\(nameLength!)"910print("useProfile=\(useProfiletrue)")11print(labellength=3)
    outputuseProfile=true
    length=3
  1. useProfile ← false, profile ← nil, nameLength ← nil, label ← missing

    5let useProfile→ false = false6let profile→ nil: Profile? = useProfilefalse ? Profile(name: "Rin") : nil7let nameLength→ nil = profile?.name.countnil8let label→ missing = nameLengthnil == nil ? "missing" : "length=\(nameLength!)"910print("useProfile=\(useProfilefalse)")11print(labelmissing)
    outputuseProfile=false
    missing
chaining Optional chaining returns another optional. If any link is `nil`, the whole expression becomes `nil`.