
「オプショナルって何??」
Swiftをはじめたばかりの人がよくぶつかる疑問ですよね。
オプショナルを使えば、「値があるかもしれないし、ないかもしれない」という状況を安全に扱うことができます。
今回はこのオプショナルについてSwift初心者の方にもわかりやすいように豊富な具体例で解説していきます!
オプショナルってなに?
オプショナルとは「値があるか、またはnil(値がないこと)」の2つの状態を持てる型のことです。
普通の変数は必ず値を持ちますが、オプショナルは「値があるかもしれないし、ないかもしれない」という不確実な状態を扱うための仕組みです。
1 2 3 | var name: String = "Taro" // 絶対に値がある var nickname: String? = nil // 値があるかもしれない(オプショナル) |
この ?
がついているのがオプショナル型です。
「nil(=なにもない)」を入れられるようになります。
なんでオプショナルが必要なの?
Swiftは「nilのままアクセスしてクラッシュ!」という状態になるのを防ぐためにオプショナルという仕組みを使っています。
つまり、「この変数はnilになる可能性がありますよ」と明示しておくことで、予防線をはってくれているんです。
オプショナルはどうやって使う?
オプショナルは、?
をつけることで作れます。
1 2 | var email: String? = "user@example.com" |
オプショナルはそのままでは直接使えないので、中身を取り出す必要があります。
これを「オプショナルのアンラップ」といいます。
具体例①:if let を使ったアンラップ
アンラップする時によく使うのがif let 構文。
1 2 3 4 5 6 7 8 | var email: String? = "user@example.com" if let unwrappedEmail = email { print("メールアドレスは \(unwrappedEmail) です") } else { print("メールアドレスが設定されていません") } |
このように、if let
を使うと中身があるときだけ safely(安全に)使えるんです!
具体例②:guard let を使ったアンラップ
関数の中などでよく使われるのが guard let
です。
1 2 3 4 5 6 7 8 9 | func sendEmail(to email: String?) { guard let address = email else { print("メールアドレスがありません") return } print("送信先: \(address)") } |
guard let
は、中身がなかったら早めに抜けるというときに便利です。
具体例③:強制アンラップ(!)に注意!
if let や guard let でのアンラップ以外にもオプショナルから中身を取り出す方法があります。
それが強制アンラップといって、オプショナルの後ろに ! をつける方法です。
1 2 3 | var username: String? = "SwiftUser" print(username!) // 強制的に取り出す |
!
を使うと強制的に取り出せますが、中身がnilだった場合、アプリがクラッシュしてしまうので危険です。
絶対にnilじゃないと確信があるとき以外は使わないようにしましょう。
具体例④:nil合体演算子(??)でデフォルト値を入れる
下記のように nil合体演算子(??)でデフォルト値を入れる方法もあります。
1 2 3 | let name: String? = nil let displayName = name ?? "ゲスト" |
上記は name が nil の場合は ?? の後の ゲスト の値を入れるという意味です。
このように値がnilなら代わりの値を使うことができます。
とてもよく使われるテクニックです!
まとめ
- オプショナルは「値があるかもしれないし、ないかもしれない」を表す型
?
をつけるとオプショナルになる- 中身を使うときは
if let
やguard let
で安全にアンラップ !
での強制アンラップは危険なので注意??
を使えばnilのときにデフォルト値を設定できる
「なんでこんな面倒な仕組みがあるの?」と思うかもしれませんが、オプショナルはアプリがクラッシュしないように守ってくれる大事な仕組みなんです!
まずは ?
をつけて書いてみる
オプショナル型を理解するとSwiftがだいぶ理解しやすくなるはずです!