とがみんブログ
大学院の中退を決断し、徹底的に自分と向き合い就職活動をする中で、心理学や脳科学に興味を持つ。挙げ句の果てに、この世界の仕組みにも興味を持つ。そんなとがみんの考えや経験を綴ったブログです。
swift

【swift4】オプショナル型「?」「!」について徹底解説。

どうも。とがみんです。

プログラミングに関して、しっかり他者に教えることができるぐらいに理解を深めたいと思っているので、

今後、調べたことについてはこのブログにでもまとめていこうかと思います。

今回は「オプショナル型」についてです。

オプショナル型と非オプショナル型の違いについて

オプショナル型とは、変数を宣言する際に、「?」をつけることによって、その変数の中に、変数の型がもつ通常の値に加えて「nil」という値を代入することができるような型のことを言います。

「?」をつけない非オプショナル型は「nil」を許容しません。

例えば、非オプショナル型である「var num:Int」には、「…,-3,-2,-1,0,1,2,3,…」というInt型がもつ値しか代入できませんが、オプショナル型である「var num:Int?」にすると、「…,-3,-2,-1,0,1,2,3,…」に加えて「nil」という値も代入できるようになります。

ちなみに「nil」とは、何もないことを表す特別な値のことです。

以下に、オプショナル型と非オプショナル型に関して、printで出力したときの比較をしてみました。

①の変数を宣言した時点では、非オプショナル型の変数の中は空で、データ自体入っていませんが、オプショナル型には「nil」という値が初期値としてすでに入っています。

なので、②の値を代入せずに、print文で出力した場合、非オプショナル型は、値が入っていません。非オプショナル型は値が入っていないことを許容しないので、エラーが出てプログラムが通りません。

しかし、オプショナル型は「nil」という値が入っているため、エラーが出ません。

また、以下の③で「nil」を代入してみると、非オプショナル型は「nil」を許容しないので、エラーが出ますが、オプショナル型はエラーが出ません。

④の値を代入して、print文で出力した場合、オプショナル型では「Optional(値)」といった形で出力されました。

オプショナル型は、通常の型とは違うため、代入された値を利用する際には、元の型に戻す必要があります。

その操作のことを「アンラップ」と言います。次にこのアンラップについて説明していきます。

「アンラップ」について

オプショナル型は、通常の型とは違うため、代入された値を利用する際には、元の型に戻す必要があると説明しました。

戻す方法は、オプショナル型変数の最後に「!」をつけることによって戻すことができます[⑤]。

以下⑥にオプショナル型のままで計算させたプログラムを載せてますが、アンラップしないとエラーが出力されてしまいます。

⑦でオプショナル型で「nil」が入っている状態の変数をアンラップしてみました。

「nil」が入っている状態でアンラップをするとエラーが出力されてしまいます。

次にアンラップの種類はいくつかあり、それについて説明していきます。

アンラップの種類

アンラップの種類については主に、「強制的アンラップ」「オプショナルバインディング」「オプショナルチェイニング」という3つがあります。

強制的アンラップ

強制的アンラップとは、オプショナル型を強制的にアンラップする方法で、変数の中にどんな値が入っていても関係なく、その値を取り出します。

その方法は、⑤で述べた方法と同じです。

欠点としては、アンラップする対象のオプショナル型の変数が「nil」だった場合に、[エラー④]が出力され、アプリケーションが落ちてしまいます。

なので、アンラップする際はオプショナル型の中の値が「nil」でないことが保証されていないといけません。

オプショナルバインディング

次は、オプショナルバインディングについてです。

このオプショナルバインディングは、if文などの条件式と組み合わせて使います。

このように書くことによって、もし「animal」に値が入っていれば、その値を出力し、入っていなければ、elseの中のプログラムが実行され、「動物はいません」と出力されます。

強制的アンラップと違って、オプショナル型の中に「nil」が入っていても、アプリケーションが落ちることなく実行することができます。

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

オプショナルチェイニングについて。

オプショナルチェイニングとは、オプショナル型の変数に続けてプロパティを取得したり、

メソッドを呼び出す場合に使い、オプショナル型の中身が「nil」の可能性があるものに対してのアクセスの仕組みです。

オプショナル型に値が入っている場合、変数をアンラップ後、中身が取り出され、それに続くプロパティを取得したり、メソッドを呼び出すことが可能です。

ただし、取得したプロパティやメソッドの戻り値はオプショナル型になります[⑪]。

オプショナル型に入っている値が「nil」の場合は、取り出したプロパティやメソッドの戻り値は「nil」になります[⑫]

アンラップの方法について説明してきました。最後に、オプショナル型のメリットについてまとめていきたいと思います。

オプショナル型のメリット

最後になぜオプショナル型のメリットについて最後にまとめようと思います。

オプショナル型を利用することによって、値がない状態を許容することができるようになります。

それによって、値が入っていないことによりアプリケーションが落ちてしまうことを防ぐことができるようになります。

まとめ

オプショナル型について説明していきました。

もし、何かわからない点、間違えている点があれば、ご連絡いただけると嬉しいです。

スポンサードリンク