読者です 読者をやめる 読者になる 読者になる

使って創ってApp

ソフトウェアを使ったり作ったりするブログです

Swift 2.1 Optional型について

Swift 2.1 の Optional型について Apple のドキュメントを読んだので、まとめます。

developer.apple.com

Optional型って?

Optional型 は String? や Intのように表し、型の直後に ? を付けます。

簡単にまとめると、その変数や定数に本当に値が入っていますか?実は値は入ってないんじゃないですか?とプログラマに認識させる型です。

例えば、テキストフィールドの値をラベルに表示するとします。もしテキストフィールドに値が何も入っていなければ、ラベルは何を表示すればいいのか分かりません。その結果エラーが発生して、アプリが落ちてしまうのです。

Label_Result.text = TextField_Input.text!
// TextField_Inputになにも値が入っていないとクラッシュ!

どうして落ちるの?

先ほどの例でいうと、nil という特殊な値が Label_Result.text に代入されてしまっているのです。

// Label_Result.text = TextField_Input.text!
// TextField_Inputになにも値が入っていないとnilが代入される
Label_Result.text = nil

nil は Optional型の変数や定数にしか代入できないので、アプリが落ちてしまうのです。

let num: Int = 20
num = nil // コンパイルエラー

Optional型を使う

Optional型の変数や定数を使うには以下の方法を使います

  • nilじゃないよ!と指定する
  • nil かチェックする
nilじゃないよ!と指定する

Optional型の変数や定数の直後に ! をつけることで Optional型ではなくなります。これは「アンラップ」と呼びます。この値は確かに存在するんだ!と自分で指定する方法です。

// Label_Result.text = TextField_Input.text! // アンラップ

nil かチェックする

上の例で示したように、アンラップではエラーを起こす可能性があります。そこで、nil かどうかチェックするようにしましょう。if文を使います。

if TextField_Input.text != nil {
  Label_Result.text = TextField_Input.text
} else {
  // テキストフィールドに値がなかった時の処理
}

nil かチェックすると同時に変数や定数を定義することができます。

if let input = TextField_Input.text {
  Label_Result.text = input
} else {
  // テキストフィールドに値がなかった時の処理
  // input に nil が代入されてしまう時の処理
}

まとめ

Opational型の変数や定数を使うときは、

  • 値が確実に入ることが分かっていればアンラップする
  • if 文でチェックする

上記2点を心がけましょう。