質問: 下記関数のSwitch文について、質問させて下さい。 ``` func f1(obj: AnyObject) -> AnyObject { switch obj { case let arr as NSArray: return arr case let dic as NSDictionary: return dic default: return obj } } ``` 引数のobjに配列を入れれば、 ``` case let arr as NSArray: return arr ``` が実行され、 連想配列を入れれば、 ``` case let dic as NSDictionary: return dic ``` が実行されます。 objが配列、連想配列のいずかにcastできればtrueが返ってきて、分岐されるのだと思うのですが、 「case let arr as NSArray:」の表記方法は何かの略なのでしょうか? Optional Bindingの一種? 理解はできるのですが、これがどういった機能を使用しているのかがわからないですので教えて下さい。 参考になるサイトがあれば、それも教えて頂ければありがたいです。 よろしくお願いします。
回答: Swiftのswitch-caseに使われる構文はパターンと呼ばれるものです。構文規則としてのpatternは、様々なところに顔を出すのですが、残念ながらswitch-caseに使用可能なパターンがどのようなものでどんな意味で実行されるのかは公式ドキュメントでも、きちんとは記述されていません。 あなたがあげられた例は構文規則上Type-Casting Patternsと呼ばれるものですが、同時にその内部にValue Binding Patternを持っているので、`let`を使ってマッチする値を保持する変数の定義が同時にできるようになっています。(Optional Bindingと異なり、マッチに使う値が`Optional`型である必要はありません。) とりあえずこちらのサイト(元ネタはこちらのようです)がうまく整理してくださっていますので一読してみられてはいかがでしょうか。