【Swift入門】強制的アンラップやifやguardを用いたオプショナルチェイニングなどオプショナル型のまとめ

2020年12月15日

オプショナル型とは何もないことを表す記号であるnilを入れることができるデータ型のことです。

型とはいっても、IntやStringなどのようではなく、そういった既存の型をオプショナル型にして使います。

オプショナル型にすることを『ラップする』と言います。

ラップ(wrap)は『包む』という英単語であるので、既存の型をオプショナル型にすることは、オプショナル型で包み込むようなイメージですね。

逆にオプショナル型から既存の型を取り出すことを『アンラップする』と言います。

オプショナル型は

let 定数名: Optional<型> = 型に対応した値

と記述します。

同じ内容で簡単に書くこともできて、

let 定数名: 型?

と記述します。

型の後に『?』をつけるだけなので簡単ですね。

ちなみに、プログラミングでは処理内容は同じだけど簡単な書き方のことを『シンタックスシュガー』と呼びます。

それでは実際にオプショナル型の変数や定数を作ってみましょう。

新しくPlaygroundを作って空にしてください。

オプショナル型の基本

オプショナル型は2種類の書き方がありましたが、今回はよく使われる簡単な方の書き方で書きましょう。

書き方としては、型の後に『?』をつけるだけですね。

var optionalInt: Int?

と記述しましょう。

作った変数『optionalInt』の値をコンソールに出力してみましょう。

オプショナル型に初期値を指定していない場合『nil』が格納されるので、そのように出力されるはずです。

実行ボタンを押してください。

コンソールをみてみると、予想通り『nil』が出力されましたね。

次に変数『optionalInt』に初期値を与えてみましょう。

値はなんでも良いのですが、今回は『30』を与えてみようと思います。

var optionalInt: Int?

var optionalInt: Int? = 30

と書き換えてください。

オプショナル型に値を入れた場合、普通の値ではなくオプショナルで包まれた(ラップされた)値となります。

例えば今回の場合だと、『30』という普通の値ではなく、『Optional(30)』が変数には格納され、コンソールに出力するとそのように出力されるはずです。

実行して実際にそうなるのか確かめてみましょう。

実行ボタンを押してください。

すると予想通り『Optional(30)』とコンソールに出力されます。

オプショナルで包まれた値は普通の値と同じように扱うことができません。

普通の値と同じように扱いたい場合は、アンラップしてオプショナルの包みを解く必要があります。

アンラップの種類は複数あり、主要なものでは強制的アンラップ、オプショナルバインディング、などがあります。

それぞれ説明していきましょう。

強制的アンラップ

強制的アンラップは一番簡単なアンラップの方法です。

簡単ではあるのですが、値にnilが入っていても関係なしにアンラップしてしまいます。

そのため、確実にnil以外の値が入ってることが確認できる状況でのみ使います。

強制的アンラップは

オプショナル型の変数!

と記述します。

『!』をつけるだけなので簡単ですね。

実際に強制的アンラップを使ってみましょう。

今までに書いたコードをコメントアウトしてください。

それでは強制的アンラップを使ってみましょう。

var optionalInt: Int? = 30
print(optionalInt!)

と記述しましょう。

コードについて説明します。

まず、

は『optionalInt』というInt型の変数を作って、『30』という値を格納し、オプショナルで包み込んでいます。

『optionalInt』には『Optional(30)』が格納されているます。

次に

は『optionalInt』を強制的にアンラップした値をコンソールに出力する記述です。

オプショナルで包まれた変数に『!』をつけることにより

強制的アンラップがなされます。

『optionalInt』には『Optional(30)』が格納されており、それをアンラップするのでコンソールには『30』と出力されるはずです。

実行して確かめてみましょう。

実行ボタンを押してください。

すると、予想通りコンソールには『30』と出力されます。

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

オプショナルバインディングはifやguardを使って、オプショナル型の値がnilかどうかで処理を分けます。

強制的アンラップとは違い、値がnilであってもうまく処理することができます。

そのため、比較的よく使われるアンラップ方法です。

ifとguardでオプショナルバインディングをそれぞれやっていきましょう。

ifを使ったオプショナルバインディング

まずはifからです。

ifを使ったオプショナルバインディングは

if let 定数名 = オプショナル型の変数 {
    nilではないときの処理  
}
else {
    nilのときの処理   }

と記述します。

それでは、実際に使ってみましょう。

その前に、前回書いたコードをコメントアウトしておきましょう。

それでは、ifを使ったオプショナルバインディングをやっていきます。

var optionalInt: Int? = 30
if let unwrapedInt = optionalInt {
    print(unwrapdInt)
}
else {
    print(“unwrapedIntはnil”)
}

と記述しましょう。

コードについて説明していきます。

は『optionalInt』というInt型の変数を作って、『30』という値を格納し、オプショナルで包み込んでいます。

次のifからがオプショナルバインディングです。

オプショナルバインディングでは何をやっているのか詳しく説明していきましょう。

オプショナル型の変数、今回であれば『optionalInt』が

nil以外であれば定数を新しく作ってアンラップした値を格納し、

ifの処理が呼ばれます。

オプショナル型の値がnilであればelseの処理が呼ばれます。

この状態で実行してみましょう。

今回はoptional型の

値は『30』であり、

nilではないので、定数unwrapedIntには

アンラップされた値である『30』が格納されます。

ifの処理はコンソールにunwrapedIntの値を出力するものなので、

実行するとコンソールには『30』と出力されるハズです。

実行ボタンを押してください。

すると予想通りコンソールには『30』と出力されましたね。

次に変数『optionalInt』の値をnilに変更して実行してみましょう。

これを

このように書き換えます。

このように変更するとelseの処理が呼ばれます。

elseの処理は『unwrapedIntはnil』と

コンソールに出力するといったものです。

実際にそのように出力されるのか実行して確かめてみましょう。

実行ボタンを押してください。

予想通り『unwrapedIntはnil』とコンソールに出力されましたね。

guardを使ったオプショナルバインディング

次にguardを使ったオプショナルバインディングをやっていきましょう。

ifを使った方法との相違点は、ifの場合は作った定数はifの中だけしか使えないのですが、guardの場合はguardの外でも定数を使うことができるという点です。

guardを使ったオプショナルバインディングは

guard let 定数名 = オプショナル型の変数 else {
    nil時の処理       
    return}nilではない時の処理

と記述します。

それでは実際にguardを使ったオプショナルバインディングをやっていきましょう。

その前に、前回使ったコードをコメントアウトしておいてください。

それでは、やっていきましょう。

var optionalInt: Int? = 20

func Unwrap(){
    guard let unwrapedInt = optionalInt else {
        print(“unwrappIngはnil”)
        return
    }
    print(unwrapedInt)
}

Unwrap()

と記述してください。

コードについて説明していきましょう。

大まかな流れとしては、まず『optionalInt』というInt型の変数を作って、『20』という値を格納し、オプショナルで包み込んでいます。

次にguardを使ったオプショナルバインディングを含んだ関数を『Unwrap』作って、

その関数『Unwrap』を使うという流れです。

わざわざ関数の中でguardを使う理由としては、関数かクロージャの中でなければreturnを記述できないためです。

クロージャではなく、関数を使った理由としては関数の方が個人的に書きやすいからです。

それでは関数『Unwrap』について詳しく説明していきましょう。

まず、optionalIntがnilかどうかを確認して、

nilであればelseが呼ばれます。

elseの中ではコンソールに『unwrappIngはnil』と出力する『print(“unwrapIntはnil”)』

が呼ばれた後に、returnで

処理を抜けます。

optionalIntの値が

nilではない場合、新しく作った定数『unwrapedInt』にアンラップした値を格納します。

その後にguardの外側の処理が呼ばれます。

optionalIntをアンラップした値が格納される定数『unwrapedInt』はguardの外でも使うことができます。

この状態で実行してみると変数『optionalInt』の値はnilではないので、

アンラップされた値である『20』が定数『unwrapedInt』に格納され、

guardの中の処理が呼ばれることなく、外側の処理が呼ばれます。

外側の処理は定数『unwrapedInt』の値をコンソールに出力する内容なので、実行するとコンソールには『20』と出力されるはずです。

実行ボタンを押してみましょう。

実行すると予想通りコンソールには『20』と出力されますね。