Swift nil の外し方 - shirajira/family-account-ios GitHub Wiki

Swift nil の外し方

実装方法いろいろ

if let

最もスタンダードなやり方(だと思う)。

let user: User? = ...

if let unwrappedUser = user {
    // `nil` でないときの処理

    let name = unwrappedUser.name
}

if の中で使用できる unwrappedUser は非オプショナルである User であることが確定している。
また,else を追加すれば nil だったときの処理も記述できる。

let user: User? = ...

if let unwrappedUser = user {
    // `nil` でないときの処理
} else {
    // `nil` だったときの処理
}

ちなみに,同名でもいける。

if let user = user {
    let name = user.name
}

guard let

対象の変数が nil だったら処理を中断したいという場合によく使う。

let user: User? = ...

guard let unwrappedUser = user else {
    // `nil` だったときの処理
    return
}
// `nil` でないときの処理
let name = unwrappedUser.name

ルールとして,guard 内には returnthrow を含める必要がある。

'guard' body must not fall through, consider using a 'return' or 'throw' to exit the scope

!

強制的に脱がす。「強制アンラップ」という。

let user: User? = ...

let name = user!.name

usernil だった場合,プロセスが死ぬ。

?

とりあえずそのまま使う。

let user: User? = ...

let name = user?.name

型推論により,name もオプショナル型となる。
usernil だった場合,namenil となるが,プロセスは死なない。

??

let user: User? = ...

let initialName = "Unknown"
let name = user?.name ?? initialName

もし user?.namenil だったら initialName を代入する構文。
nil でない場合は user.name が代入される。

ちなみに,三項演算子で置き換え可能。

let name = (user?.name != nil) ? user!.name : initialName

C/C++ 出身の人にとってはこっちのほうが馴染みがあるかもしれないが,Swift ではあまり見かけない。


参考:
【Swift】 Optional Value が nil の場合の処理方法 - Qiita