There are many similarities and just a handful of differences.
(Regular) Optionals
-
Declaration:
var opt: Type?
-
Unsafely unwrapping:
let x = opt!.property // error if opt is nil
-
Safely testing existence :
if opt != nil { ... someFunc(opt!) ... } // no error
-
Safely unwrapping via binding:
if let x = opt { ... someFunc(x) ... } // no error
- Using new shorthand:
if let opt { ... someFunc(opt) ... } // no error
- Using new shorthand:
-
Safely chaining:
var x = opt?.property // x is also Optional, by extension
-
Safely coalescing nil values:
var x = opt ?? nonOpt
Implicitly Unwrapped Optionals
-
Declaration:
var opt: Type!
-
Unsafely unwrapping (implicit):
let x = opt.property // error if opt is nil
-
Unsafely unwrapping via assignment:
let nonOpt: Type = opt // error if opt is nil
-
Unsafely unwrapping via parameter passing:
func someFunc(nonOpt: Type) ... someFunc(opt) // error if opt is nil
-
-
Safely testing existence:
if opt != nil { ... someFunc(opt) ... } // no error
-
Safely chaining:
var x = opt?.property // x is also Optional, by extension
-
Safely coalescing nil values:
var x = opt ?? nonOpt