How do you unwrap Swift optionals?
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
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
Since Beta 5 we have also the new coalescing operator (??):
var a : Int?
let b : Int = a ?? 0
If the optional is != nil it is unwrapped else the value on the right of the operator is used