【SwiftUI】オプショナル型とオプショナルバインディング
- 2024.05.11
- SwiftUI
- SwiftUI, オプショナルバインディング, オプショナル型
本記事では、オプショナル型のデータはどんなデータなのか、他のデータ型の違い、宣言方法から使い方まで解説していきます。
IntやString型などの基本的なデータ型は理解しているけれどもオプショナル型のデータがどんなデータなのかがよくわからないという方におすすめです。
オプショナル型とは
オプショナル型データは、整数/文字列/配列などとは少し異なる特殊なデータ型となります。
オプショナル型と他のデータ型の大きな違いは、nilを代入できるか否かになります。オプショナル型の変数にはnilを代入することができ、それ以外のデータ型の変数にはnilを代入することはできません。また、nilを代入することができない普通のIntやStringなどのことを非オプショナル型と呼んだりもします。
オプショナル型データの特徴として、変数宣言時にデータ型の後ろに!や?のような記号がついていることが挙げられます。実際の宣言方法については後述します。
オプショナル型の宣言
オプショナル型とは、一般的にnilを代入することができる、あるいはnilが入っている可能性のあるデータ型変数のことを示します。オプショナル型の宣言にはデータ型の後ろに「?」がつけられます。
オプショナル型と似たような型である強制アンラップ型を宣言する際には、変数宣言時にデータ型の後ろに「!」をつけます。それぞれについて説明していきます。
オプショナル型
オプショナル型は以下のように宣言します。Int型やString型のような一般的なデータ型の変数宣言の後ろに「?」をつけるだけです。
var age: Int?
var name: String?
オプショナル型は変数にnilを代入することができる型と説明しましたが、その理由はオプショナル型はデータがラップに包まれているような構造になっているためです。
nilはIntやString型の変数には代入することができず、それらのデータを扱うことを前提とした処理の中でnilが入ってくると予期せぬエラーが発生してしまうといったような悩みの種の一つでもあります。
しかし、実際のアプリケーションでは入力項目に値が入ってこない場合など、データがないことを表すためにnilは欠かせない存在です。
そこで必要になるのがnilを代入することができるオプショナル型です。オプショナル型であることでnilが入ってくる可能性があることを認識できるだけでなく、オプショナル型のデータ自体がそのまま使用できるデータではないため、値を確認してから安心して使用することができます。
オプショナル型のデータはラップがかかっている状態で、ラップを外さなければ中の値を使用することができないものだと覚えておいてください。
var age: Int?
var name: String?
name = "田中一郎"
age = 25
print(name)
print(age)
//実行結果
"Optional("田中一郎")"
"Optional(25)"
実際のオプショナル型変数の値を確認してもらうとわかる通り、実際のデータにOptional()というラップがかけられています。このデータはそのままでは結合したり、画面に表示したりの処理はできず、ラップを外してあげる必要があります。ラップの外し方については後述します。
以下の例では、オプショナル型Intのnum1とInt型のnum2を加算しようとして、「オプショナルのInt型をアンラップしてInt型にしてください」といエラーが出ていることが確認できます。
var num1: Int? = 1
var num2: Int = 2
num1 + num2
//エラー表示
Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
暗黙的アンラップ型
暗黙的アンラップ型は、オプショナル型と同様にnilを代入することが出来る型です。
宣言時には、変数のデータ型の後ろに「!」をつけます。
var age: Int!
var name: String!
オプショナル型と暗黙的アンラップ型の違いは、変数に入っているデータをそのまま使用することが出来るかどうかという点になります。
オプショナル型の説明では、データにラップがかかっている状態でそのままでは使用できないとお伝えしましたが、暗黙的アンラップ型はラップを外している状態ですのでそのまま使用できます。
暗黙的アンラップ型変数は、IntやStringのデータに加えてnilも代入できるようになった存在です。ラップを外すことなくそのまま使用できて、一見便利に見えますが、変数の中身がnilであるのかそうでないのかが保証されないまま使用できてしまうため、アプリケーションで使用するには危険が伴います。
オプショナル型と非オプショナル型のIntの変数同士の加算ではエラーとなりましたが、以下のように暗黙的アンラップ型とInt型の変数では計算ができることが確認できます。
var num1: Int! = 1
var num2: Int = 2
print(num1 + num2)
//実行結果
3
実際の開発では推奨されないデータ型となりますが、確実にnilが入らないことを保証される場合には使用することが出来るかと思います。
オプショナル型のアンラップ
オプショナル型の変数の中に入っているデータを実際に使用するケースについて説明していきます。
オプショナル型のデータはラップに包まれている状態で、そのラップを外してデータを使用できる状態にすることをアンラップと言います。
実際のデータでは、データから”Optional()”という情報を取り除くことを表します。ご紹介する2つのアンラップ方法は以下になります。
オプショナルバインディング
オプショナル型のデータの中身を確認して、安全にアンラップする方法をオプショナルバインディングといいます。
var num1: Int? = 1
var num2: Int = 2
if var unwrappedNum = num1{
print(unwrappedNum + num2)
}else{
print("num1の値がnil")
}
このようにオプショナル型のデータをif文を用いて判定し、データが入っている場合にはtrue、nilの場合にはfalseの結果を返すため、nilの場合に後続の処理を行うことができます。
条件式の中で、変数や定数にオプショナル型のデータを代入した場合、代入された変数にはアンラップされた値が入ります。そのため、後継の処理ではアンラップ後の値をそのまま使用することが可能になります。
強制アンラップ
オプショナル型のデータの中身に関わらず、データをアンラップして使用できる状態にする方法を強制アンラップと言います。
オプショナル型変数の後ろに「!」をつけることで実行可能です。
var num1: Int? = 1
var num2: Int = 2
print(num1! + num2)
強制アンラップはオプショナルバインディングのように条件式を書いたりする必要はなく、簡単にアンラップを実現することができますが、変数の中身がnilである場合には処理が落ちてしまうため、確実にデータがnilでない場合にのみ使用することが推奨されます。
オプショナル型まとめ
オプショナル型のデータを宣言し使用する方法までを解説してきました。nilを含むデータを扱う場面は開発の場面では多くなってくると思いますので、オプショナル型データの扱いはきっちり覚えておくことが重要です。
- オプショナル型は、通常のデータに加えてnilを代入することが可能なデータ型
- オプショナル型のデータはラッピングされていてそのままでは使用できず、アンラップしてから使用する必要がある
- オプショナルバインディングは、オプショナル型のデータがnilであるかそうでないかを判定してから後継の処理を行うことができる安全なアンラップ方法
- 強制アンラップは、オプショナル型の中身のデータに関係なくデータをアンラップしてしまうため安全な方法ではない。
他にもナビゲーションビューを利用した画面遷移やクラスとインスタンスの使用方法などについても解説していますので以下の記事もSwiftUIを利用した開発に役立ててみてください。
-
前の記事
【SwiftUI】要素のシャッフルと乱数(ランダム)の使い方 2024.05.06
-
次の記事
【SwiftUI】トグルスイッチの使い方 2024.05.12