目次

目次

SwiftのOptionalとは

アバター画像
弘田諒
アバター画像
弘田諒
最終更新日2018/02/16 投稿日2018/02/16

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に値が入っているため一応動く
    var name:String?
    name = "Hirota"
    
    print(name!) //String型
    print(type(of: name!))
    -----------------------------
    ログ
    Hirota
    String
    
    nilのnameを強制アンラップしているためクラッシュ
    var name:String?
    
    print(name!) //クラッシュ
    

まとめ

今回は簡単にOptional型について書きました。 紹介した使い方以外にもメソッドの引数をOptional型にするなど様々な使い方がありますが、
非常に長くなるので割愛します。

OptionalはSwiftをやるにあたって基礎中の基礎なので抑えておきたいところです。
しかしプログラミング初心者の場合はそもそも
nilってなに?
nullと何が違うのか分からないなど躓きやすいポイントでもあります。

アバター画像

弘田諒

職種 : iOSエンジニア

目次