【Swift】オプショナル型について

こんにちは。ゆーすけです。

今回はプログラミング言語【Swift】のオプショナル型の解説をしていきます。このオプショナル型って本当に迷惑でややこしいですよね。何度パニック状態になったことか。

オプショナル型の書き方と扱い方を少しでもイメージして頂ければなーという気持ちで今回は書いていこうと思います。多少自分の備忘録も兼ねています。笑

オプショナル型とは

まず、オプショナル型が何かを見ていきましょう。

var hoge: String?
var piyo: String!

型の後ろにクエスチョンマークビックリマークをつけるとオプショナル型となります。オプショナル型の意味は、値は入ってないけどそのうち値が入りますよって意味になります。
※今回の例ではString型の値がそのうち入るよということになります。

クエスチョンマークビックリマークは厳密には違う意味になりますが、とりあえずここでは気にせず同じものだと考えてください。ただ、基本的にはクエスチョンマークを使った方が良いです。最後にビックリマークの方は説明します。
では、下記3つの順で見ていきましょう。

・どんな時に使うの?
・アンラップの方法
・個人的お勧め

どんな時に使うの?

まず、これどんな時に使うの?って感じなんですけど例えば、twitterとかのSNSをイメージしてください。プロフィール画像とかありますよね?
これって設定してる人もいれば、設定してない人もいると思うんです。ということは無い場合もあるし、ある場合もある
オプショナル型のコード的にはこんな感じです。

var profileImage: UIImage?

もしイメージがあった場合はこんな感じで値をいれます。

profileImage = UIImage(named: "some_image")

こーゆー場合にオプショナル型を宣言しておいて、設定の無い人(nil)の人は画像を表示しない。そして、ある人は表示する。みたいな使いわけをしてあげます。※nilは値が何もない状態。

アンラップの方法

アンラップの方法をご紹介する前に、何故アンラップが必要なのかを説明しておきます。
オプショナル型は値が入っていない可能性(nil)も含まれる為そのまま使う事はできません。簡単に言うと、全く信用されてない型って感じですね。そこで「使っても大丈夫ですよ!」って事を明示的に示してあげる必要があり、その時の方法がアンラップになります。

では、アンラップの方法を見ていきましょう。
アンラップの方法は大きく5つあります。

1. 強制アンラップ
2. if let
3. guard let
4. オプショナルチェインニング
5. Nil Coalescing Operator

1. 強制アンラップ

まず強制アンラップから。
皆さんもXcodeに怒られてこんな感じで書いた記憶はありませんか?

var hoge: String?
nameLabel.text = hoge!

このhogeの後ろのビックリマーク強制アンラップです。
強制アンラップの意味は、値が入っててもnilでも「無理やりアンラップするよ!」って意味になります。つまり、どんな状況でも使おうとします。

ここで注意していただきたいのは、もし値がnil強制アンラップをしてしまうとアプリが落ちます。もちろん使い所によって強制アンラップを使った方が良い時もあるのですが、最初のうちはあまり使わない方が良いです。

2. if let

次は『if let 』です。if let はこんな書き方をします。

var hoge: String?
if let unwrappedHoge = hoge {
       nameLabel.text =  unwrappedHoge
}

if let は、値がnilじゃない事を確認し、値が入っている場合はカッコ中の処理を行います。この例で言うとhogeに値がある場合はunwrappedHogeに値を入れてカッコの中の処理を行います。

3. guard let

次は『guard let 』です。guard let はこんな書き方をします。

var hoge: String?
guard let unwrappedHoge = hoge else {
     return
}
nameLabel.text =  unwrappedHoge

else { return }までがセットになります。
これは先ほどのif let とは違い、もし値がnilだったらカッコ内のリターンの処理を行います。そして値が入っていたらカッコ以降の処理が実行されます。使い所としては、早期リターンしても問題ない場合や、ネストを深くしたくない場合に使用します。

4. オプショナルチェインニング

次にオプショナルチェインニングですが、これは少しだけアンラップとは意味合いが異なります。

var hoge: String?
let hogeCount = hoge?.count

let hogeCount = hoge?.countハテナマークの事になります。
もし値がある場合は処理が走り、nilの場合は処理が実行されません。
ただし、処理が実行されないだけでアプリが落ちることはありません

5. Nil Coalescing Operator

?? という演算子を使う事で、nilの場合の値を入れることができます。
これは三項演算子と呼ばれるものの省略形となります。

var hoge: String?
let hoge1 = hoge ?? "hogehoge"

個人的お勧め

お勧めの方法は、if letguard letです。
初めのうちは、強制アンラップはあまり使わない方が無難かなと思います。というか僕もあまり使いたくありません。笑

もし迷ったらif let を使い、ここはguard let の方が良いかな?って場合はguard let を使ってあげると良いと思います。
ただ、状況によってはどうしても値を入れたい場合もあると思うので、そんな場合はnil Coalescing Operator を使うのも全然ありです。
とりあえず強制アンラップは気をつけて!笑

var hoge: String! のビックリマークについて

では、最後に

var hoge: String!

この形のオプショナル型を説明しておきます。
まず、このビックリマークは強制アンラップのビックリマークとは別物になるので、ここでは強制アンラップのビックリマークは忘れてください。

これは暗黙的アンラップ型といってnilじゃない事を暗黙的に保証している型になります。

どーゆーことかというと「使う時は絶対値が入ってますよ!」というのを型宣言時に保証していますよって意味です。オプショナル型だけど使う時は100%値が入ってから落ちることはない。てことを宣言してる感じですね。
メリットとしては、先ほど説明したアンラップをする必要がなくなるのですが、クエスチョンの時と同じように、もし値がnilだったらアプリは落ちます

これも使い方次第では、活用できそうですがあまりお勧めはしないです。
ただ絶対使ってはいけないということでは無いので、大事なのは意味を理解した上で使う事だと思います。

おわりに

今回はSwiftのオプショナル型についてご説明させて頂きました。
まぁ、迷った時はif let 使いましょ!

では、良いコーディングライフを。
ではでは。

この記事が気に入ったらサポートをしてみませんか?