【Swift入門】オプショナル(Optional)型の基本を徹底解説!

こんにちは!フリーエンジニアのヤマシタです。

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)を許容できるので、さまざまなメリットがあります。

もしオプショナルについて忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。