Swift特有の言語仕様「!」「?」の整理

変数とnil, Optional型

 Swiftの特徴の1つ「安全のための設計」です。
 この1つがOptional型の導入です。Optional型を使うことで変数の中身やメソッドの帰値がnilになる可能性をプログラムで明示的にすることが可能になります。プログラミング時にその扱いを間違えた時にコンパイラが警告やエラーを表示することができます。

Optional型の宣言

 Optional型の宣言は収納する型を指定します。

var optionalString1: Optional<String>
var optionalString2: String? // 「?」は省略形

Optional型のアンラップ

 Optional型の変数のままではもとの型として扱うことができません。そのためアンラップを行います。
 アンラップにはいくつかの方法があります。
■ Forced Unwrapping
Optional型の値や変数は後ろに「!」記号を付けることでアンラップして元の型に戻すことができます。

var optionalString: Optional<String> = "Hello"
var unwrappedString:  String = optionalString! // アンラップして変数に代入

Forced Unwrappingは強制的にアンラップします。そのための値がnilの場合は実行時にランタイムエラーとなりアプリは強制終了してしまいます。
■ Optional Binding
Swiftには中身がnilでないかの確認とアンラップを同時に行う構文が用意されています。

var optionalString: Optional<String> = "Hello"
if let unwrappedString = optionalString {
  unwrappedString.lowercaseString
}

■ Optional Chaining
元の型のメソッドを使用することを目的としたアンラップ方法です。

var optionalString: Optional<String> = "Hello"
optionalString?.lowercaseString

Optional Chaingでのアンラップの値はOptional型として返されます。また、変数がnilだった場合、結果はnilになります。
「値がnilでなければ処理をし、nilなら何もしない」という処理がシンプルに実行できます。
■ Implicitly Unwrapped Optional (※ Implicitly: 暗黙のうちに)

var optionalString1: ImplicitlyUnwrappedOptional<String> = "Hello"
var optionalString2: String! = "Hello" // 「!」は省略形
optionalString1.lowercaseString
optionalString2.lowercaseString

optionalString型はOptional型と同様にnilとString型の値を収納できます。Optional型と同じように使用できますが、使用時には自動的にアンラップされます。
ImplicitlyUnwrappedOptional型も値がnilの時にアンラップしようとするとランタイムエラーとなる可能性があります。ImplicitlyUnwrappedOptional型もif文を使用してのnilチェックはOptional Bindingが利用可能です。