【Swift4】swiftの!や?って?オプショナルを理解しよう

2020年8月29日

swiftによくでてくる!や?ですが、swift特有のプログラム方法で、最初はとっつきにくいと思いますが、理解してしまえば簡単です。以下要点だけをまとめてあります。

1. swiftのクラス(型)には非オプショナル型とオプショナル型がある
2.クラス(型)の後に!や?がついているものはオプショナル型となる
3.オプショナル型の特徴はnilの代入が許可されている

特に重要なのは3の「オプショナル型の特徴はnilの代入が許可されている」というところでしょう。実際にプログラムして検証してみましょう。

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

非オプショナル型

var string : String = "非オプショナル型"
var number : Int = 123

非オプショナル型の場合、クラス(型)の後ろに!や?はつけません。
また、初期値を設定しないと初期値がnilとなるため、非オプショナル型ではエラーになります。
非オプショナル型の場合は、初期値を入れるようにしましょう。

オプショナル型

var string : String! 
var number : Int?

オプショナル型の場合、クラス(型)の後ろに!や?をつけます。
また、オプショナル型の場合、初期値を設定しなくともnilの許可がされているのでエラーになりません。

非オプショナル型とオプショナル型のよくある間違い

var string : String = nil
// エラーになる

オプショナル型じゃないのでnilを代入することはできません。

var string : String
print(string)
// エラーとなる

printの場所で「Variable 'string' used before being initialized」というエラーになります。
非オプショナル型の場合、変数に値を入れないと使うことができないということです。

!と?の違い

var string : String = "非オプショナル型"
print(string)
// 非オプショナル型

var string : String? = "オプショナル型"
print(string)
// Optional("オプショナル型")

var string : String! = "オプショナル型"
print(string)
// some("オプショナル型")

!と?はどちらもオプショナル型ですが、厳密には少し特性が異なります。

一般的に、オプショナル型(Optional)というと?の方をさします。
!は暗示的アンラップ型(Implicitly Unwrapped Optional)と呼ばれるオプショナル型です。

実はオプショナル型の中にアンラップの種類によるさらに細かい分類があるのです。
その違いが?と!の違いになってきます。

では、アンラップについて、、、とアンラップについて説明したいところなのですが、アンラップの話にも及ぶと少々複雑になってくるので、今回はこのあたりまで理解できて入れば十分だと思います。

非オプショナル型やオプショナル型を使い分けることにより、わかりやすく、またクラッシュしにくいプログラムになるので、是非マスターしましょう!