OptionalはSwiftの特殊なデータ型で、T型の値を持つことができるか、まったく値を持たない(nil)ことができます。T?の形で表されます。変数が値を持たない可能性があることを明示的に指定でき、コンパイル時に値の存在をチェックすることが保証されます。
値の取り出しメカニズム:
let str: String? = "hello" if let s = str { print(s) }
guard let s = str else { return } print(s)
let s = str!
(値がnilの場合、ランタイムクラッシュを引き起こす可能性があります)
let length = str?.count
??):let value = str ?? "default"
String型の変数にnilを代入できますか?それともString?型でなければなりませんか?その場合どうなりますか?
回答:
いいえ、通常の型(String)の変数にはnilを代入できません。optionalのみがnilを持つことができ、それ以外の場合はコンパイルエラーになります。
例:
var a: String // a = nil // コンパイルエラー: Nil cannot be assigned to type 'String' var b: String? b = nil // OK
物語
アプリケーションで値をforce unwrappingする際、データベースから常に正しい応答が来ると考え、フィールドが存在しない場合にクラッシュが発生しました。このエラーはoptional bindingを介した追加のチェックを行うことで修正されました。
物語
プッシュ通知の送信中、ユーザー名が非optional変数に保存されていたため、APIからの名前が空である場合にアプリケーションがクラッシュしました。分析の結果、型がoptionalに変更され、nil処理が追加されました。
物語
プロジェクト内でoptional値を関数に渡す際、引数がnon-optional型として宣言されていました。隠れたバグやクラッシュが発生しました。変更が行われ、パラメータの型がoptionalにされ、値の存在のチェックが追加されました。