この世でいちばんわかりやすいiPhoneアプリ開発のおはなし【強制アンラップを学ぶ】
オプショナルについて理解しておくと、このページの理解が深まります。オプショナルの基本については、こちらのページで解説しています。
オプショナルから値を取り出す
オプショナルな型として宣言したあとは、通常の型と同様に値を設定できます。
var stockPrice: Double?
stockPrice = 123.45
上のコードは、株価に123.45ポイントの初値がついたことを示しています。
ここで、株価が1.5ポイント値上がりしたので、加算します。 次のようなコードを記述すると、コンパイラはエラーを報告します。
stockPrice = stockPrice + 1.5 // error
これは、「異なるデータ型同士を加算しようとしている」ことが原因です。 変数stockPriceはオプショナルなDouble?型ですが、1.5は通常のDouble型です。
このような場合は感嘆符!を使って、オプショナル型を「通常のデータ型」に戻すことができます。
stockPrice = stockPrice! + 1.5 // 124.95
エラーが解消されて、問題なく株価の上昇が加算できるようになりました。 このように、オプショナル値の後に感嘆符!を追記して、オプショナル型を通常のデータ型に戻すことを アンラップ といいます。
ランタイムエラー
次に、もうひとつ「別の株価」を追跡する変数を宣言します。
var anotherStockPrice: Double?
anotherStockPrice // nil
この変数anotherStockPriceはオプショナルなDouble?型であると宣言されています。 したがって、既定値は自動的にnilが設定されます。
先ほどと同様にアンラップするため、この変数anotherStockPriceに感嘆符!を追記します。
anotherStockPrice = anotherStockPrice! + 1.5 // Runtime error
このコード自体は不正ではないので、コンパイル時にエラーは報告されません。 しかし、実行するとランタイム・エラーが発生し、プログラム全体がクラッシュします。 これは、nilが設定されているオプショナル値をアンラップしたことが原因です。
Swiftが安全なプログラミング言語である理由
Swiftプログラミングにオプショナルという概念が存在する理由はなんでしょうか? 結論から言うと、通常のデータ型にnilを設定させないことは「安全なプログラミングを実現する」からです。
反対に、オプショナルという概念が存在しなかったら、どのようなことが起こるでしょうか? プログラマーが意図ぜずに「値がない状態」の変数に対して何らかの処理を行い、予期しない結果を招く恐れがあります。 最悪の場合、ランタイム・エラーが発生してプログラムはクラッシュします。
オプショナルがあれば、通常のデータ型を使用している限り、変数の値がnilになることはありません。 それだけで、ランタイム・エラーが発生する可能性は減少します。 また、変数がオプショナル型であっても、プログラマーが意図的にアンラップしない限り、その具体的な値にアクセスすることはできません。 したがって、「意図しないnilへのアクセス」を回避することができ、プログラムの安全性は向上します。
この記事が気に入ったらサポートをしてみませんか?