FRMSKI開発ブログ

プログラミング、UI / UX、仕事、読書のことなど、日々の記録を綴ります

分かりにくいSwiftのオプショナル型「?」と「!」の違いについて

オプショナル型について簡略に説明している記事が少なかったので短くまとめて見ました。

オプショナル型とは?

オプショナル型は変数にnilの代入を許容するデータ型です。nilはデータがない状態。 そして、オプショナル型の変数には「?」か「!」をつけます。 こんな風に

var num:Int?
var text:String!

iOSではnilでアプリが落ちないように、基本的にはnilは出さないように設計されています。 ただ、このオプショナル型を使うとnilを変数に代入できるようになるということ。 非オプショナルの変数は使うことができません。 つまり以下のソースはエラーが出ます。

var test: String
println(piyo) //エラーが出ます

【※注意】ちなみに変数の宣言以外で使う「?」「!」はオプショナル型ではありません。

「?」と「!」の違い

では、「?」と「!」はどうやって使い分けるのでしょうか。
一般的なオプショナル型は「?」ですが、「!」は暗黙的アンラップ型(Implicitly Unwrapped Optional)と呼ばれます。下記のソースをご覧ください。

var optional: Int? = 10 // オプショナル型
// そのまま出力するとOptional()がつく...
println(optional)
// => Optional(10)

// !をつけると強制的にアンラップする
println(optional!)
// => 10

オプショナル型はそのまま出力すると変数として使えません。「!」をつけてアンラップする必要があります。

アンラップ型「!」について

アンラップ型「!」にも種類があります。暗黙的アンラップと強制的アンラップ。
変数宣言時に使う「!」は暗黙的アンラップで、変数を使うときに「!」をつける必要が無くなります。 強制的アンラップはオプショナル型を使うときに「!」をつけることによってOptional()でラップされずに使うことができます。

まとめ

初心者の方は色々考えると複雑になるので、nilを防ぐために「?」でオプショナル型宣言し「!」でアンラップとだけおぼえましょう。 今回紹介したのは基本的な使い方ですが、応用編はまた別の記事にしたいと思います。