Swiftにはオプショナル(Optional)型というnilを許容できる変数を使うことができます。
この記事では、
・オプショナルとは?
・オプショナルの基本的な使い方
というオプショナル型の基本的な解説から、
・オプショナルのアンラップ
・オプショナルのバインディング
・暗黙的なオプショナル型
などの応用的な使い方に関しても解説していきます。
今回はそんなオプショナル(Optional)の使い方についてわかりやすく解説します!
※この記事ではSwift4.0を使用しています。
オプショナル(Optional)とは
オプショナル型は、通常の変数と異なり空の値(値が無い)状態を保持することができる変数です。
Swiftでは空の状態をnilで表します。
オプショナルの宣言
オプショナル型を宣言するときは、変数の型の後ろに?(クエスチョン)をつけます。
オプショナルの宣言:
var text: String?
オプショナル型は変数の宣言と同時に自動でnilが代入されます。そのため、「text = nil」のように初期化する必要はありません。
逆に通常の変数(非オプショナル型)は変数にnilを代入すると「nil cannot be assigned to type」のエラーとなります。
オプショナルのメリット
オプショナル型はnilの代入を許容することは上述したとおりですが、どのようなメリットがあるのでしょうか?
Swiftでは基本的にnilの値を参照しようとすると他のプログラミング言語同様アプリケーションが落ちてしまいます。
しかし、そのような問題を解決するためにオプショナルを使うことでnilを許容することができるようになりました。
また、変数にnilを許容するか明示的にできることにより、変数のnilチェックを省くことができて、より安全なコードを記述することができます。
オプショナルの基本的な使い方
ここではオプショナルの基本的な使い方を見ていきましょう。
オプショナルは先述したとおりnilを代入できるため、オプショナルで宣言した変数がnilであっても参照できます。
//オプショナル型の宣言 var name: String? print(name)
実行結果:
nil
printで出力すると、上記のようにnilが出力されることがわかりますね!
非オプショナル型の場合は、変数の値にnilを代入するとエラーが発生します。
//非オプショナル型の宣言 var name: String name = nil // エラー
また、オプショナルは配列はディクショナリも同様に宣言できます。
//オプショナル型の配列を宣言 var fruits1: Array<String>? fruits1 = ["apple", "orange", "melon"] print(fruits1) //オプショナル型のディクショナリを宣言 var fruits2: Dictionary<String, Int>? fruits2 = ["apple": 100, "orange": 80, "melon": 500] print(fruits2)
実行結果:
Optional(["apple", "orange", "melon"]) Optional(["melon": 500, "apple": 100, "orange": 80])
オプショナルのアンラップ
オプショナル型と非オプショナル型は同じように変数の操作をすることができません。
var num1: Int = 1 var num2: Int? = 2 print(num1 + 1); // 2 print(num2 + 1); // エラー
上記のプログラムを実行すると、IntとInt?は別の型となるため、オプショナル型にInt型の値を代入しようとすると、
「error: value of optional type ‘Int?’ not unwrapped; did you mean to use ‘!’ or ‘?’?」
のエラーが発生します。
そのため、オプショナル型の変数の値がnilでないことを明示するためにアンラップする必要があります。
アンラップ(unwrap)とはラップ(包装)の反対語でオプショナル型で包まれた変数を解除するような意味合いで使われます。
アンラップするためにはオプショナル型の変数の後ろに「!」を付けます。
//オプショナル型を宣言 var num: Int? num = 100 print("num:\(num!)")
実行結果:
num:100
上記のように「!」でアンラップすれば安全に値を参照することができます。
オプショナルの変数の値がnilの場合はアンラップするとエラーとなりますので注意しましょう。
オプショナルのバインディング
オプショナル型はif文などの条件式で使用できます。
オプショナル型は値がnilのときはFALSE、それ以外はTRUEを返します。
以下のようにオプショナル型を用いて比較することをバインディング(Binding)と呼びます。
//オプショナル型の宣言 var num: Int? //Binding if let sum = num { print("sum:\(sum)") } else { print("値が設定されていません。") }
実行結果:
値が設定されていません。
暗黙的なオプショナル型
最後にオプショナルのもう一つの宣言方法を紹介します。
オプショナル型は宣言時に型の後ろに「?」を付けるのは説明したとおりですが、暗黙的なオプショナル型を宣言するときには、型の後ろに「!」をつけます。
暗黙的なオプショナルの宣言:
var text: String!
オプショナルを暗黙的に宣言すると、使用時にアンラップする必要がありません。
そのため、初期値はnilでも使うときには値が格納されていることがわかっているときには暗黙的なオプショナル型を宣言したほうが安全です。
しかし、暗黙的なオプショナル型でも値がnilでアンラップが必要なときにそのまま使用するとエラーとなりますので注意しましょう。
//暗黙的なオプショナル型の宣言 var num: Int! print(num) // null num = 100 print(num) // 100 num = nil print(num + 10) // エラー
まとめ
ここではSwiftのオプショナル(Optional)について、
・オプショナルとは?
・オプショナルの基本的な使い方
・オプショナルのアンラップ
・オプショナルのバインディング
・暗黙的なオプショナル型
などについて解説しました。
オプショナル型は値が空(nil)を許容できるので、さまざまなメリットがあります。
もしオプショナルについて忘れてしまったら、この記事を思い出してくださいね!