SwiftのOptionalとは
はじめに
Swift関連の記事を書きたいと思いましたが、
Swiftの記事を書くと必ずと言って良いほどOptionalという単語が出てくるため先にOptionalについて書きたいと思います。
Optionalとは
- Optionalとはデータ型の一種である
正式名称はOptional型 - Optional型で定義された変数はnilを許容する
非Optional型にはnilを代入することはできない
非Optional型の正式名称はImplicitly Unwrapped Optional型
定義の仕方
型宣言の後ろに「?」書くことでOptional型が定義されます。
nilを許容するので空で宣言できます。
下記の定義を日本語に直すと
「nameはOptional型でString型の値を持っているかもしれないし、持っていないかもしれない」
です。
var name:String? |
nilを許容したくない場合は、
型宣言の後ろに「!」を書くことでImplicitly Unwrapped Optional型として定義されます。
Implicitly Unwrapped Optional型として定義する場合はnilを許容しないので宣言時に値を入れておく必要があります。
nilを許容しないので初期値を入れておく必要があります。
var name:String! = "Hirota" |
実際の動き
var name:String? print(name) ----------------------------- ログ nil |
Optional型で定義された変数を使用する際はアンラップする必要があります。
var name:String? name = "Hirota" name = name + "Ryo" //nameがOptional型なのでコンパイルエラー |
Optional型をアンラップする場合は基本的に下記二つの構文を使います。
下記二つの構文を使うことでOptional型に安全にアンラップできます。
- if-let構文
右辺のOptional型をアンラップして左辺のnameに代入します。
ifのスコープ内ではOptional型ではなくString型として扱えます。var name:String?name = "Hirota"if let name = name {//nilではなかったときprint(name) //String型print(type(of: name))} else {//nilだった場合の処理}print(name) //Optional型print(type(of: name))-----------------------------ログHirotaStringOptional("Hirota")Optional - guard-let構文
右辺のOptional型をアンラップして左辺のnameに代入します。
if-let構文と違う点はアンラップ後の変数をifのスコープ外で使用できる点です。
guard-let構文はtrueの場合の処理が無いif文と考えると分かりやすいです。var name:String?override func viewDidLoad() {super.viewDidLoad()name = "Hirota"guard let name = self.name else {//nilだった場合の処理return}print(name) //String型print(type(of: name))// Do any additional setup after loading the view, typically from a nib.}-----------------------------ログHirotaString - 例外
上記二つのアクセス方法以外にも強制アンラップという方法があります。
変数の後ろに!をつけることで強制的にアンラップすることができます。
しかしこの方法はOptional型の変数がnilだった場合はクラッシュします。nameに値が入っているため一応動く
var name:String?name = "Hirota"print(name!) //String型print(type(of: name!))-----------------------------ログHirotaStringnilのnameを強制アンラップしているためクラッシュ
var name:String?print(name!) //クラッシュ
まとめ
今回は簡単にOptional型について書きました。
紹介した使い方以外にもメソッドの引数をOptional型にするなど様々な使い方がありますが、
非常に長くなるので割愛します。
OptionalはSwiftをやるにあたって基礎中の基礎なので抑えておきたいところです。
しかしプログラミング初心者の場合はそもそも
nilってなに?
nullと何が違うのか分からないなど躓きやすいポイントでもあります。