Optionals
Optional Chaining
Optional chaining calls a property or method only when the optional contains an instance.
Read through an optional
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)
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
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`.