LoginSignup
1
2

More than 3 years have passed since last update.

【Swift】オプショナル型とnilの基本

Last updated at Posted at 2020-08-02

はじめに


今回は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を書く上で非常に重要な、オプショナル型の基本について解説しました。オプショナル型についてはまだまだ大切な使い方があるので、また今度オプショナル型に関した記事を書こうと思います。オプショナル型はすごく大切な知識なので、ぜひ身に着けてください。

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2