今回の記事ではオプショナルの使い方について解説します。
アプリケーション開発においてnilの処理を失敗すると
アプリケーションが急に落ちてしまうなどの不具合に繋がります。
オプショナルはSwift言語において、nilを安全に処理するための型となります。
今回の記事を読みオプショナルについての理解を深めて
堅牢なアプリケーション開発の基礎を身につけましょう。
・オプショナルについて
・オプショナルの宣言の仕方(通常と暗黙的アンラップ)
・オプショナルのアンラップの仕方
①強制的アンラップ
②オプショナルバインディング
③オプショナルチェイニング
・暗黙的アンラップについて
- Swiftのオススメの勉強法
SwiftUIでアプリ開発を始める時の勉強法。どうする? - プレイグラウンドの使い方
【Swiftのお勉強】プレイグラウンドを使ってSwiftを勉強しよう!- SwiftUIアプリ開発基礎 - Swiftでの変数の宣言の仕方
【Swiftのお勉強】変数の宣言と代入の仕方〜四則演算 – SwiftUIアプリ開発基礎 - Swiftでの文字列の扱い方
【Swiftのお勉強】文字列の定義とよく使う操作方法 – SwiftUIアプリ開発基礎
1. オプショナルについて
Swift言語においてオプショナル型と非オプショナル型の二つに型を大別することが出来ます。
非オプショナル型には、”nil“を格納することが出来ないのに対して
オプショナル型では、”nil“を格納することが出来ます。
オプショナル型で定義される変数の値は全て”Optional()“の中に格納されます。
オプショナル型で”nil”が格納できるのも、値が”Optional()“に格納されるのが理由です。
2. オプショナルの宣言方法
オプショナル型の宣言方法を解説します。
オプショナル型の宣言は次のように”?“を使用して行います。
var Test: String?
非オプショナル型の場合は次のように”?“を付けずに宣言します。
var Test: String
もちろん、オプショナル型でも値を入れての宣言を行うことも出来ます。
値を入れない場合はnilが値となります。
var Test: String? = "Test"
また、オプショナル型には暗黙的なアンラップ型というものがあります。
暗黙的な形で宣言する場合は”!“を使用します。
var Test: String!
暗黙的アンラップ型については、後述します。
3. オプショナルの使い方
オプショナル型というのは、宣言された値が”Optional()“に包まれている状態になっています。
“Optional()“を包み紙のようなものだと捉えた時、変数を純粋な値として取り扱うためには
アンラップ(unwrap)する必要があります。
Optional()で包まれているおかげで”nil“の状態でも取り扱うことができるのです。
アンラップする方法はいくつかあります。
②アンラップバインディング
③アンラップチェイニング
それぞれのアンラップの仕方を解説していきます。
1. 強制的アンラップ(Forced Unwrapping)
まず、強制的にアンラップする方法です。
強制的にアンラップして変数の操作をする場合は、”!“を使用する必要があります。
この手法は、値の中身に関係なく変数をアンラップしてしまいます。
そのため、値が”nil“の場合であってもアンラップして値が取り出されてしまうので注意が必要です。
オプショナル型で宣言を行った変数で、四則演算を行ってみます。
まずは”!“を使用しない例をみてみます。
var Test:Int? = 1 Test + 10
これはエラーとなり、次のようなメッセージが現れます。
force-unwrap using ‘!’ to abort execution if the optional value contains ‘nil’ Test + 10
エラーが出力理由は先ほど説明したとおり、Testという変数が”1″ではなく、”Optional(1)“として定義されているからです。
“Optional(1)“を”1“に変換するためにアンラップして使用しましょう。
Test! + 10 //11となる
2. オプショナルバインディング(Optional Binding)
オプショナルバインディングでは強制的なアンラップとは違い
値が”nil“かどうかを判定しながらアンラップすることが出来ます。
このアンラップの仕方は、if文のような条件式と一緒に使用します。
それでは、コードと一緒に詳細を確認しましょう。
“Test”というオプショナル型の変数を宣言して、値がある場合は値をprintで出力し、値がない場合は”nilです。”と出力するようなコードを用意しました。
var Test: String? // オプショナル型で定義 if let unwrapTest = Test { print(unwrapTest) //Testがnilでない場合は、値を出力する。 } else { print("nilです。") //Testがnilの場合は、"nilです。"と出力する。 }
この場合は、”Test”に値が定義されていないので、中身は”nil”となっています。
そのため、else側の処理が行われます。
//elseの処理が呼ばれる else { print("nilです。") //"nilです。"と出力される。 }
次は”Test”に値を入れて宣言した場合はどうなるでしょうか?
var Test: String? = "Test"// オプショナル型で定義 if let unwrapTest = Test { print(unwrapTest) //Testがnilでない場合は、値を出力する。 } else { print("nilです。") //Testがnilの場合は、"nilです。"と出力する。 }
値が入っているので、if側の処理が呼ばれます。
//ifの処理の方が呼ばれる if let unwrapTest = Test { print(unwrapTest) //"Test\n"と出力される }
3. オプショナルチェイニング(Optional Chaining)
オプショナルバインディングと同じように安全に値を取り出すことができる方法がオプショナルチェイニング(Optional Chaining)です。
オプショナルチェイニングでは、オプショナル型の変数の後ろに”?“を付けて関数のメソッドやプロパティにアクセスします。
“オプショナル型の変数”?.プロパティ
この時、
オプショナル型の変数に値が入っているのか?
nilが入っているのか?
を調べて、値が存在している場合のみ処理を継続します。
nilが入っている場合は、nilを返し処理を継続しません。
具体的な例を確認していきましょう。
まず、強制的なアンラップを使用した場合は次のようになります。
2行目の”Test!“で強制的にアンラップしていますね。
import SwiftUI var Test: String? // オプショナル型で定義 let Test2 = Test!.contains("Blog")
これを実行するとエラーになります。
Fatal error: Unexpectedly found nil while unwrapping an Optional value: file __lldb_expr_13
これは、Testの値が定義されておらず”nil“になっているのが原因です。
オプショナルチェイニングを使うとエラーとはならず、”nil“が返されます。
import SwiftUI var Test: String? // オプショナル型で定義 let Test2 = Test?.contains("Blog") //nilが返される
このように、nilになる可能性があるメソッドやプロパティにオプショナルチェイニングは非常に有効です。
4. 暗黙的アンラップ型
“2.オプショナルの宣言”で暗黙的アンラップ方について紹介しましたが、ここでもう少し詳細に説明します。
暗黙的アンラップ型は、変数の使用時に自動的にアンラップされる型です。
通常の”?“を使った宣言とは違い、アンラップする必要がありません。
具体的に見ていきましょう。
//暗黙的アンラップ型で定義した場合はアンラップせずに使用することが出来る var Test: Int! = 1// 暗黙的アンラップ型で定義 Test + 10 //11になる。
オプショナル型では、四則演算をする場合には”!“をつける必要があったと思います。
しかし、暗黙的アンラップ型ではそのまま変数を使用することが出来るのです。
しかし、変数にnilが入っている場合などアプリケーションが落ちたりするので
使用する時は必ず値が入っている変数で使用するようにしましょう。
4. まとめ
オプショナルの使い方について解説していきました。
通常の変数よりも使い方が少し難しいですが、安全なアプリケーションを開発するためにしっかりと理解しておくようにしましょう。
・オプショナル型はnilを格納することが出来る
・オプショナルの宣言は2種類ある(通常と暗黙的アンラップ)
・通常のオプショナルで宣言した場合は、アンラップする必要がある
・アンラップの種類は3種類
・暗黙的アンラップでは、アンラップをする必要はないがnilが入るとエラーになるので注意が必要
コメント
Great post. I was checking constantly this weblog and I am impressed!
Extremely helpful info specially the final part 🙂 I deal with such info much.
I used to be seeking this certain info for a long time.
Thank you and good luck.