2017-06-02 4 views
2

コンパイラのバグか、気付いていないものがあるかどうかわかりません。私はコンパイル時にSegmentation fault: 11を取得プロトコルとのスウィートパターンの一致

switch (param) { 
     case (.a, let param as Equatable), 
      (.b, let param as Equatable): 
      print("a or b with protocol \(param)") 
     default: print("none of above") 
    } 

:ように私は、プロトコルにマッチしたい場合は、しかし、

enum SomeEnum { 
     case a, b, c 
    } 

    let param: (SomeEnum, Any) = something 
    switch (param) { 
     case (.a, let param as Int), 
      (.b, let param as Int): 
      print("a or b with solid type (Int) \(param)") 
     default: print("none of above") 
    } 

:コンクリートの種類と照合すると

私のような2例を組み合わせることができます。このためのソリューションは、次のようなコードを複製することです:

switch (param) { 
     case (.a, let param as Equatable): 
      print("a or b with protocol \(param)") 
     case (.b, let param as Equatable): 
      print("a or b with protocol \(param)") 
     default: print("none of above") 
    } 

誰かがこのように動作する理由を教えてもらえますか?

+2

クラッシュコンパイラは*必ず*バグです。 –

+1

segfaultは、常に、コンパイラのバグです。 https://bugs.swift.org/secure/Dashboard.jspaまたはhttps://bugreport.apple.com/また、https://github.com/practicalswift/swift-compiler-crashesに寄付することもできます。 –

+0

やや良い回避策として、最初のケースで 'fallthrough'を使うことができます。 –

答えて

0

これで少しうんざりしています。

私は確信していますparam等価へのキャストはかなり役に立たず、決して使用することはできません。 Selfが必要で、通常の変数にキャストしても機能しないということを考えれば、それはまったく驚いています。

コンパイラはのいずれかを実行できないはずですが、のどちらかですが、2番目の例は誤って動作していたか、古いアプローチの残りの部分として機能しています。 (補足として、スイッチパターンマッチングはオーバーホールのために行われるので、すぐに適切なコンパイラエラーが発生する可能性があります)。

私は、最初のものがうまくいかない理由は、複数オプションのスイッチケース変数(口がいっぱいです)を使用するときに変数が定義される方法と関係があると考えています。 Equatableの2つの異なるインスタンスを同じ変数に設定しようとしていた場合、基礎となるタイプは2つの異なるタイプになる可能性があります。試しても試してはいけませんが、試してみると内部的に。

私の推測で、これはすでに報告または固定スウィフト4のために、それはレーダーファイルおよび/またはSwift bug trackerに報告する損はないされていますされています

関連する問題