###はじめに
今回はSwiftを書いていくうえでとても重要な、オプショナル型の基本について解説します。
###オプショナル型とnilとは
Swiftでは扱うべき値が存在しないことを表すために、nilという特別な値が存在しています。変数や定数、関数の返り値、式の評価結果や、通常の値だけでなく未設定やエラーなどの状態を表すことがある場合、その値をnilで表現します。
例えば整数の場合、変数や式の型はInt型ですが、通常はInt型の値を持ち、特殊な場合にnilを値として持つことがある変数や式は、Int?型で扱います。これをオプショナルInt型と呼びます。次の例を見てください。
var a : Int = 0
var b : Int? = 10
b = nil //代入可能
a = nil //エラー
このように、int型は整数以外の値を保持できませんが、オプショナルint型は整数以外に値nilを保持することができます。
なおオプショナル型は、データ型のイニシャライザの返り値にも使われます。ここではInt型イニシャライザの、文字列を引数とするイニシャライザの例を以下に示します。
let olympic = "2020"
var year : Int? = Int(olympic) //2020が返される
var city : Int? = Int("Tokyo") //整数として評価できないので、nilが返される
このように引数の文字列を整数として評価した値を返しますが、整数として評価できなかった場合はnilを返すため、このイニシャライザの返り値を受け取る変数の型はInt?である必要があります。
###オプショナル型の値を開示する
オプショナルInt型(Int?型)の値は整数かnilですが、型がInt型ではないので、そのままInt型に代入することも、Int型として式の中で演算することもできません。そのためにオプショナル型からデータを取り出す、すなわちInt?型からInt型を取り出す必要があります。このことを、ここでは開示と呼ぶこととします。開示のためにはオプショナル型に対して「!」という記号を使います。具体的な例を以下に示します。
let year : Int? = Int("2020")
let next : Int = year! + 4 //開示指定(!)が必要
この例ではyearの後ろに!がないとコンパイル時にエラーとなります。では、オプショナル型の変数の値がnilだった場合はどうなるのでしょうか。
let year : Int? = Int("令和20年") //yearの値はnil
let next : Int = year! + 4 //実行時エラーになる
この場合にはInt型の値を取り出すことができないので、コンパイルはできますが実行時にエラーになります。また、開示さえすれば復合代入演算子を使うこともできます。
###条件判定
オプショナル型は開示しようとしても、nilが格納されているとエラーが発生してしまいます。そこで、開示前にどんな値が格納されているのか確認する方法として、比較の演算子「==」や「!=」を利用することができます。この際に開示は必要ありません。以下に例を示します。
var nagano : Int? = Int("1998")
if nagano != nil { //真(ここでは開示指定は使わない)
print("Nagano: \(nagano!)") //ここで開示指定が必要
}
if nagano == 2020 { //偽(ここでは開示指定は使わない)
print(2020)
}
変数または定数をnilと比較したとき、nilなのかどうかが調べられます。値と比較すると、nilではなく、かつその値かどうかが調べられます。
###終わりに
今回はSwiftを書く上で非常に重要な、オプショナル型の基本について解説しました。オプショナル型についてはまだまだ大切な使い方があるので、また今度オプショナル型に関した記事を書こうと思います。オプショナル型はすごく大切な知識なので、ぜひ身に着けてください。