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
内には return
や throw
を含める必要がある。
'guard' body must not fall through, consider using a 'return' or 'throw' to exit the scope
!
強制的に脱がす。「強制アンラップ」という。
let user: User? = ...
let name = user!.name
user
が nil
だった場合,プロセスが死ぬ。
?
とりあえずそのまま使う。
let user: User? = ...
let name = user?.name
型推論により,name
もオプショナル型となる。
user
が nil
だった場合,name
も nil
となるが,プロセスは死なない。
??
let user: User? = ...
let initialName = "Unknown"
let name = user?.name ?? initialName
もし user?.name
が nil
だったら initialName
を代入する構文。
nil
でない場合は user.name
が代入される。
ちなみに,三項演算子で置き換え可能。
let name = (user?.name != nil) ? user!.name : initialName
C/C++ 出身の人にとってはこっちのほうが馴染みがあるかもしれないが,Swift ではあまり見かけない。