LoginSignup
3
3

More than 5 years have passed since last update.

Optional基礎

Last updated at Posted at 2014-12-24

OptionalはObjective-Cにおける nil を返しうるメソッドのようなもの。
つまり、オブジェクトの生成に失敗した場合には値を返さない。
Objective-Cでは構造体や基本型に使えなかったのに対し、SwiftのOptionalは全ての型に使える。

String.toInt()

例えば String 型の toInt というメソッドは、 Int に変換できない場合もある。
なので、このメソッドの返す型は Optional Int になる。

let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()
// convertedNumber は Int?型

nil

もし、変数や定数が nil を取る可能性がある場合、必ずOptionalで宣言しろ。

var serverResponseCode: Int? = 404
serverResponseCode = nil

また、デフォルト値を与えずにOptionalで宣言した場合は、 nilで初期化される。

var surveyAnswer: String?
// surveyAnswerはnil

Forced Unwrapping

Optional型に値が入っているかどうかは==!=nil と比較することによって可能。
Optional型に値が入っているのが確実で、その値を取り出す操作を Forced Unwrapping という。
値は ! を変数名の最後に付けると取り出せる。

if convertedNumber != nil {
    println("\(convertedNumber!)")
}

Optional Binding

ifwhile 文の条件式の部分で、一時的にOptional型を他の変数や定数に格納して、その文の中で使えるようにする技を Optional Binding という。

if let actualNumber = possibleNumber.toInt() {
    println("\'\(possibleNumber)\' は \(actualNumber)")
} else {
    println("\'\(possibleNumber)\' は整数に変換できません")
}

この場合 !を付けなくても値を使える。
let の代わりに var にもできて、この場合は変数として扱える。

Implicitly Unwrapped Optionals

プログラムの中でこの変数には必ず値が入っていることが保証されている場合があると思う。
そういうときは変数の宣言時に型の最後に ! を付けて宣言すると、いちいち Forced Unwrapped で取り出さなくてよくなる。
これを Implicitly Unwrapped Optionals (暗黙にアンラップされたOptional)という。
この機能が一番活躍する場面はクラスの初期化時であるが、そこについてはここでは触れない。

// これは通常のOptional型からForced Unwrappedによって値を取り出す方法
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // !がここで必要

// これはImplicitly Unwrapped Optional
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // !がいらない

Implicitly Unwrapped Optionalに何も値が入っていない時にアクセスするとランタイムエラーになる。

通常のOptional型と同様に nil との比較もできる。

if assumedString != nil {
    println(assumedString)
}

Optional Bindingも使える。

if let definiteString = assumedString {
    println(definiteString)
}

注意

Implicitly Unwrapped Optionalに何も値が入っていない時にアクセスするとランタイムエラーになる。
Implicitly Unwrapped Optionalを nil と比較する可能性のある変数に使ってはいけない。

3
3
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
3
3