23623


下記関数のSwitch文について、質問させて下さい。

[code]

    func f1(obj: AnyObject) -> AnyObject {
        switch obj {
        case let arr as NSArray:
            return arr
        case let dic as NSDictionary:
            return dic
        default:
            return obj
        }
    }
    
[/code]

引数のobjに配列を入れれば、

[code]

    case let arr as NSArray:
        return arr
    
[/code]

が実行され、  
連想配列を入れれば、

[code]

    case let dic as NSDictionary:
        return dic
    
[/code]

が実行されます。

objが配列、連想配列のいずかにcastできればtrueが返ってきて、分岐されるのだと思うのですが、  
「case let arr as NSArray:」の表記方法は何かの略なのでしょうか？  
Optional Bindingの一種？

理解はできるのですが、これがどういった機能を使用しているのかがわからないですので教えて下さい。  
参考になるサイトがあれば、それも教えて頂ければありがたいです。

よろしくお願いします。


CC BY-SA 3.0
2016-03-30T03:57:32.153
23608
2016-03-30T12:11:37.600
question
ios swift
switch文の分岐について


Swiftのswitch-
caseに使われる構文はパターンと呼ばれるものです。[構文規則としてのpattern](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Patterns.html#//apple_ref/doc/uid/TP40014097-CH36-ID419)は、様々なところに顔を出すのですが、残念ながらswitch-
caseに使用可能なパターンがどのようなものでどんな意味で実行されるのかは[公式ドキュメント](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097)でも、きちんとは記述されていません。

あなたがあげられた例は構文規則上[Type-Casting
Patterns](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Patterns.html#//apple_ref/doc/uid/TP40014097-CH36-ID425)と呼ばれるものですが、同時にその内部に[Value
Binding
Pattern](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Patterns.html#//apple_ref/doc/uid/TP40014097-CH36-ID422)を持っているので、`let`を使ってマッチする値を保持する変数の定義が同時にできるようになっています。(Optional
Bindingと異なり、マッチに使う値が`Optional`型である必要はありません。)

とりあえず[こちらのサイト](http://qiita.com/mono0926/items/f2875a9eacef53e88122)(元ネタは[こちら](http://appventure.me/2015/08/20/swift-
pattern-matching-in-detail/)のようです)がうまく整理してくださっていますので一読してみられてはいかがでしょうか。


CC BY-SA 3.0
2016-03-30T10:57:09.560
23623
2016-03-30T12:11:37.600
2016-03-30T12:11:37.600
8000
13972
23608
answer