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
if
や while
文の条件式の部分で、一時的に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
と比較する可能性のある変数に使ってはいけない。