オプショナル型の使い方について超簡単に復習しよう!その3

この記事は2016年5月18日に書かれたものです。内容が古い可能性がありますのでご注意ください。


STEP5.宣言方法「?」と「!」の違いについて覚えよう!


オプショナル型の使い方について超簡単に復習しよう!その2
のSTEP2でやった通り、オプショナル型の宣言には「?」と「!」の2種類の宣言方法があります。
この違いについて押さえておきましょう。
一般的にこの2つの宣言方法は、
「?」で宣言する方法を通常の「オプショナル型
「!」で宣言する方法を「暗黙的アンラップ型
と呼ばれています。
両方ともオプショナル型です。名前が紛らわしいですが。

以下の例を見てみましょう。

var num1:Int? = nil
var num2:Int! = nil

どちらの宣言方法もオプショナル型ですので値無しの「nil」を代入することができます。
ここまではどちらも問題ありません。
では次にこの2つをprint()関数で出力するように記述しましょう。

var num1:Int? = nil
var num2:Int! = nil
        
print(num1)
print(num2)

ここでもエラーは表示されないので問題ないですね。
しかし実際に実行してみると、その際にエラーが出てしまい途中で止まってしまうのがわかるかと思います。

s22_1
5行目のprint(num2)でエラーが発生しています。

「?」で宣言したnum1は問題なくnilが出力されますが、
「!」で宣言したnum2はエラーとなっています。

このように「!」で宣言されたオプショナル型(暗黙的アンラップ型)の場合は、
値としてnilを代入することができるが、その変数を使用する際にnilが代入されているとエラーになる
といった特徴があります。

次にnilではなく値が代入されている際の動作を見てみましょう。

var num1:Int? = 100
var num2:Int! = 200
        
print(num1)
print(num2)

この場合はエラーにならず正常に出力されると思いますが、出力される値の形が異なりますね。

「?」で宣言されたnum1は「Optional(100)」のように、Optional()で包まれていて、
「!」で宣言されたnum2は「200」のように、Optional()で包まれていません。

このように「!」で宣言されたオプショナル型のもう一つの特徴として、
その値にアクセスする際に強制的にアンラップして使用される
といった特徴があります。

この特徴が「暗黙的アンラップ型」と呼ばれる所以となっています。
「暗黙的」つまり「勝手に」アンラップしてくれるわけです。

【まとめ】

「?」と「!」の違いについてまとめてみましょう。

◼︎「?」(オプショナル型)
・nilを代入することができる
・その変数にアクセスする際でもnilが代入されていてもエラーにならない
・値が代入されている場合は、「Optional(値)」という形でラッピングされている
・値を取り出すには「!」という記号を付けて記述する必要がある
(前回オプショナル型の使い方について超簡単に復習しよう!その2のSTEP4でやりました)

◼︎「!」(暗黙的アンラップ型)
・nilを代入することができる
・その変数にアクセスする際にnilが代入されていればエラーになる
・値が代入されている場合は、強制的にアンラップされるため通常の値を取り出すことができる
・そのため「!」という記号を付けて取り出す必要がない

今回はここまでにしましょう。
次回はオプショナルバインディングについて学んでいきたいと思います。

  • このエントリーをはてなブックマークに追加

PAGE TOP