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

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


STEP6.オプショナルバインディングについてマスターしよう!

オプショナル型の使い方について超簡単に復習しよう!その2のSTEP4でやったように、
オプショナル型「?」で宣言された型の変数から値を取り出したい場合は「!」記号を用いて
アンラップして使用するんでしたね。

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

【出力結果】
Optional(100)
100
300

3行目ではOptional()で包まれていますが、4行目はアンラップされているため100という代入した値が
そのまま取り出せています。
そして5行目のように値を取り出すことで通常のInt型となるため、加算などの演算も可能になります。

では次の例をみてください。

var num1:Int? = nil
print(num1)
print(num1!)          //エラーとなる

【出力結果】
nil
fatal error: unexpectedly found nil while unwrapping an Optional value

エラーになってしまいましたね。このようにオプショナル型には
nilが代入されているオプショナル型の変数をアンラップしてしまうとエラーになる
という特徴があります。
オプショナル型の値を何でもかんでもとりあえずアンラップして使おうとすると痛い目を見る
わけですね。

そこでオプショナルバインディングの出番というわけです。
オプショナルバインディングはif文やwhile文の条件式で用いられ、
オプショナル型に値が代入されていた場合とnilが代入されていた場合で動作を変える
ことができるのです!!

使い方はif文やwhile文の条件式のところに、「var 変数 = オプショナル型の変数」
と記述するだけです。

ここではif文を使ったオプショナルバインディングの構文を解説します。
この構文は「if let文」などと呼ばれたりするくらい利用される頻度が高くなっています。
構文の形は以下のようになります。
if文を使うと値が空かどうかの判定を行うと同時に、アンラップされた別変数への代入を行います。


if let var 変数 = オプショナル型の変数 {
    オプショナル型の変数がnilではない場合の処理
} else {
    オプショナル型の変数がnilの場合の処理
}

else文は書いても書かなくても問題ありません。

実際に使ってみよう!

ではこの構文を使ったコードの例を書いてみます。

var num:Int? = 100

if let newNum = num {
    print(newNum)
} else {
    print("newNumに値は設定されていません。")
}

【出力結果】
100

この場合はオプショナル型の変数numに値が代入されているので、定数newNumに値を代入することが
できます。そのため、if文の判定結果はtrueとなります。
4行目の結果が出力され、100という値が返ってきます。

ここで注意するべきポイントは2つあります。まず1つめは、
newNumにはアンラップされたnumの値が代入されているという点です。
そのためprint(newNum)で数値100を取り出すことができるのです。

2つめは、
if let構文の中では定数newNumも変数numも使用できてしまうという点です。
新しく代入した定数newNumはアンラップされているのでそのままInt型の値として使用することができるのですが、
numを使用してしまうとそれはオプショナル型の値になっているため、結局アンラップしないといけないんですね。

といいますか、わざわざ「if let」みたいな仰々しい構文を用いたのに、エラーを回避するためにこの構文を用いたのに、
結局エラーの温床となってしまいます。全く意味が無いのです。

なので、「構文の中では新しく代入された定数を用いる!!」
ということを守るようにしてください。

もしくは以下のような書き方をするとさらに良いでしょう。

var num:Int? = 100
        
if let num = num {
    print(num)
} else {
    print("numに値は設定されていません。")
}

【出力結果】
100

このように構文の定数名とオプショナル型の変数名の名前を揃えるとオプショナル型の値に
アクセスする心配はなくなります。そのためエラーの心配もなくなるんですね。
こちらの記述方法の方がより安全といえます。

最後に、nilだった場合の出力結果も見てみましょう。

var num:Int?


if let num = num {
    print(num)
} else {
    print("numに値は設定されていません。")
}

【出力結果】
numに値は設定されていません。

このようにprintした際に値がnilのため異なる処理をすることができました。

まとめ

最後に見たif let構文は頻繁に使用される構文となっています。nilかどうかの条件分岐によって
エラーを回避することができ安全なプログラムを作成することができるようになります。
ぜひ使い方をマスターしておきましょう!

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

PAGE TOP