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)) ----------------------------- ログ Hirota String Optional("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. } ----------------------------- ログ Hirota String - 例外
上記二つのアクセス方法以外にも強制アンラップという方法があります。
変数の後ろに!をつけることで強制的にアンラップすることができます。
しかしこの方法はOptional型の変数がnilだった場合はクラッシュします。 nameに値が入っているため一応動く
nilのnameを強制アンラップしているためクラッシュvar name:String? name = "Hirota" print(name!) //String型 print(type(of: name!)) ----------------------------- ログ Hirota Stringvar name:String? print(name!) //クラッシュ
まとめ
今回は簡単にOptional型について書きました。
紹介した使い方以外にもメソッドの引数をOptional型にするなど様々な使い方がありますが、
非常に長くなるので割愛します。
OptionalはSwiftをやるにあたって基礎中の基礎なので抑えておきたいところです。
しかしプログラミング初心者の場合はそもそも
nilってなに?
nullと何が違うのか分からないなど躓きやすいポイントでもあります。
弘田諒
職種 : iOSエンジニア