2017-06-25 6 views
0

Swiftとパターンマッチで同時に初期値(今キャスト)を抽出することは可能ですか?例えばスイフトスイッチの値を抽出

私はこれらの列挙型があった場合、:

enum Inner { 
    case a(Int) 
    case b(Int) 
} 

enum Outer { 
    case one 
    case two(Inner) 
} 

を、私はOuter.two(Inner.a(1))に一致するように望んでいたと同時に

明らか
let value: Any // Could be anything :| 

switch value { 
case let a as Outer.two(Inner.a(1)): 
    // Do something which needs `a` 
default" 
    // Do some other things 
} 

をものに、変数のキャストを持っている、それは」doesnのasは型にキャストするだけなので、作業しません。

また、私は動作しません

case Outer.two(let a) where a == Inner.a(1): 
case let Outer.two(.a(1)) = a: // i.e. the syntax in "guard case let ..." 

を試してみました。 (NBは、最初は動作しますが、==を実装することはうるさく、私のためのオプションではありません)FYI

:あり

case a @ Outer.two(Inner.a(1)): 

:Scalaはあなたが@オペレーター、このようなものでそれを行うことができますこれを行うことができる構文、または私は私の問題を解決する方法を再考する必要がありますか?

+0

は、なぜあなたは 'ケースOuter.two(Inner.a(1))と一致することはできませんか:'?それであなたは 'a == Inner.a(1)'を知っています。 –

+0

@MartinR私は知っているだろうが、コンパイラはしないだろう - 私はそれが一致した後に 'a'を渡す必要があります。 – deanWombourne

+0

大文字と小文字が一致すると、 'let a = Inner.a(1)'を指定できないのはなぜですか? –

答えて

0

Swiftには case a @ Outer.two(Inner.a(1)):と同等のパターンはありません。ここで可能 回避策です:

switch value { 
case Outer.two(Inner.a(1)): 
    let a = Inner.a(1) 
    // Do something which needs `a` 
default: 
    // Do some other things 
}