23
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swiftのoptionalについて

Last updated at Posted at 2014-09-03

optionalについて簡潔にまとめてあるものが少なかったのでまとめてみた。

どういう場合に必要になるか

  • 変数にnilを代入したい場合
  • 引数にnilを受け取る場合

通常宣言された変数にはnilを代入することはできないが、変数をoptional宣言(ラップ)することでnilを代入することができるようになる。

使い方

型アノテーションの末尾に?を付けて宣言する。初期値はnilになる。

var optionalString: String?
optionalString  = "Hello"

ただ、optional変数はnilが含まれる可能性があるため、optionalでない変数として扱うことはできない。

func printString(string: String) {
    println("\(string)")
}

var optionalString: String? = "Hello"
// ビルドエラー
printString(optionalString)

この場合は、!を使用(アンラップ)してoptional変数がnilではないことを明示的にしなければならない。

printString(optionalString!)

ただ、!を使用した際に変数の中身がnilだと実行時に処理が落ちてしまうので都度確認する必要がある。

// 初期値はnil
var optionalString: String?

// 中身がnilなので実行時エラー
printString(optionalString!)

if optionalString != nil {
    // !を付けてnilでないことを明示的に(アンラップ)する
    printString(optionalString!)
}

あるいはifを使ってoptional変数の中身を取り出すことができ、こちらのほうが便利で一般的。

var optionalString: String? = "Hello"

// 	nilではないことを証明
if let string = optionalString {
    // stringはnilではないことが確約(アンラップ)されている
    printString(string)
}

ちなみに以下の記述は落ちる。

// 初期値はnil
var optionalString: String!

// 実行時エラー
printString(optionalString)

ちなみに以下の記述は通る。

// 初期値はnil
var optionalString: String!

// nilは許容される
func printString(string: String!) {
    println("\(string)")
}

// nilでも大丈夫
printString(optionalString)

まとめ

  • 変数にnilが入る可能性が無いなら、宣言時に何も付けない
  • 変数にnilが入る可能性があるなら、宣言時に!?をつける
  • !はoptional変数がnilではないと思われる際につける
  • ?はoptional変数がnilでも構わない時につける
23
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?