Swiftには、値が何もないことを示すnil
を表すためにオプショナル型(Optional)が存在します。
この記事では、筆者が疑問に感じた
- オプショナル型って何?
- オプショナル型はどこで使われるのか?
- オプショナル型ってどうやって使うのか?
を中心にまとめております。
『オプショナル型(Optional)』とは
Swiftでは、値が存在しないことを処理するための型があります。
それがオプショナル型です。
オプショナル型の変数は、以下のいずれかを示します。
- 「値が存在し、それは〜に等しい」
- 「値が存在しない」
オプショナル型の宣言方法
宣言方法は2通りあります。
let shortForm: Int? // 短縮版
let longForm: Optional<Int> // 正式な宣言方法
一般的に使われているのは短縮版のようです。
変数の型の後に、クエスチョンマーク(?)をつけることで宣言することができます。
この宣言の仕方で自動的にnil
が格納されるため、以下のコードと同じ意味をもちます。
let shortForm: Int? = nil
let longForm: Optional<Int> = nil
オプショナル型は値をラップしている
オプショナル型の変数に格納された値は、値そのものではないのです。
var str: String?
str = "abc"
print(str)
Optional("abc")
文字列の値がOptionalでラップされてる😱
どうやらこのままだと使えない場合があるようです。
例えば、数値の計算だったりします。
そういう場面で、オプショナル型の変数から値を取り出すには、アンラップという処理が必要になります。
値を取り出すアンラップ処理
アンラップ処理は、オプショナル型の変数から値を取り出す処理です。
値を取り出すために、次の2つのステップを経てアンラップします。
オプショナル型の変数の値がnil
と等しくないことを確認します。
オプショナル変数から値を取り出します。
var count = 0
var opt: Int? = 2
if opt != nil { // STEP 1: オプショナル型の変数がnilでないことを確認
let unwrap = opt! // STEP 2: アンラップ処理
count = count + unwrap
}
空っぽのオプショナル変数をアンラップしようとした場合、アプリがエラーを引き起こしクラッシュしてしまいます。
アプリがクラッシュしないよう、nilに対して安全に取り扱える仕様になっているのか🤔
アンラップ処理の4つの方法
強制アンラップ
この方法は、オプショナル型の変数の後ろにエクスクラメーション(!)をつける方法です。
var opt: Int?
opt = 5
var sum = 0
if opt != nil {
let unwrap = opt! // 強制アンラップ
sum = sum + unwrap
}
暗黙的アンラップ
この方法は、オプショナル型の変数の宣言時に、後ろにエクスクラメーション(!)をつける方法です。
var opt: Int!
opt = 5
var sum = 0
if opt != nil {
sum = sum + opt // 宣言時のオプショナル型の変数をそのまま使える
}
オプショナルバインディング
この方法は、オプショナル型の変数がnilかどうかを確かめるとともに、アンラップした値を定数に格納する方法です。
var opt: Int?
opt = 5
var sum = 0
if let unwrap = opt {
sum = sum + unwrap
}
少ないコード量でアンラップ処理が実現できるのか🤔
一石二鳥って感じ!
Nil結合演算子(Nil-Coalescing Operator)
この方法は、オプショナル型の変数がnilである場合にデフォルト値を設定し、nilでない場合にアンラップする方法です。
クエスチョンマークを2つ並べたNil結合演算子(Nil-Coalescing Operator)(??)の後ろに、デフォルト値を設定します。
var opt: Int?
opt = 5
let unwrap = opt ?? 0 // optはnilではないためアンラップされる
print(unwrap) // 実行結果:5
まとめ
この記事では、Swiftのオプショナル型について解説しました。
- オプショナル型は、値が存在しないnilを扱うための型
- オプショナル型の値はOptional(…)でラップされている
- オプショナル型の値を使うときはアンラップ処理が必要