【Swift】Swift2.0からのエラーハンドリング:Optional Chaining

Swift2.0からのエラーハンドリング の投稿一覧

[Swift]サウンド再生を実機検証しようとしてXcode7betaでビルド失敗した時はで触れたエラーの扱い方ですが、投稿後に調べたところSwift2.0から、Xcodeで言えばXcode7beta6から変更となっていた様です。
詳しくはXcode 7 beta 6 Release Notesに記述がありました。

この辺りの関連名詞はまだまだ日本語として浸透しておらず、検索をかけてもなんだかふわふわしている印象を受けたので覚書として項目別にまとめていこうと思います。
今回はOptional Chainingについてです。

概要

オプショナルとか、オプショナル型とか、任意型変数とか、forced unwrappingとか言われているやつです。
?(question mark) と !(exclamation mark)がコードのあちこちに付いているのを見たことがあれば、それがOptionalに関連している記述である可能性があります。

Swiftでは、言語によって許されてきた変数、定数、引数へのnil値が許可されなくなりました。
このnil周りの扱いを例外的に許可し、記述しやすくする或いはコンパクトに記述するための仕組みだと私は理解しています。

構文

下記はメンバ変数の場合。ローカル変数だとこの限りではない様子。

? (question mark)

OptionalValueとして宣言する時に付ける。

var value0: String? = "value0";

OptionalValueとして宣言された変数には、nilを定義できる。

/*value1,value2ともに、nilを定義している*/
var value1: String;  /*初期値を定義しろとエラーになる 
Stored property 'value1' without initial value prevents synthesized initializers*/
var value2: String?;  /*問題なし*/

OptionalValueとして宣言された変数はif文の条件として使用できる。

var value3: String? = "";
if (value3 != nil) {
    print("value3:\(value3)")  /*こちらが実行される*/
} else {
    print("value3:nil")
}
! (exclamation mark)

nilである可能性はあるが、アクセス時にnilではないと確信が持てるものに付ける。

var value4: String!;  /*問題なし*/

コードが実際に動いて、アクセスされた時にnilが中身だった場合はエラーになる。

class A{
    var value5:String!;
}

var a:A = A();
print(a.value5);  /*ランタイムエラーになる 
Execution was interrupted. reason:EXC_BAD_INSTRUCTION(以下略*/