2016-03-31 4 views
6

優れたブログの投稿に続いて、https://appventure.me/2015/08/20/swift-pattern-matching-in-detail/#sec-3-7私はカスタムパターンマッチングを試みました。Swift 2.2でのカスタムパターンのマッチングが期待通りに機能しない

enum LineType : String { 
    case Event = "event:" 
    case Data = "data:" 
} 

次に、文字列に1つまたはLineTypeの他の値で始まる場合は伝えることのできるString拡張子::のは、文字列のenum表す2つの種類を定義してみましょう

extension String { 
    func isOfType(type: LineType) -> Bool { 
     return self.hasPrefix(type.rawValue) 
    } 
} 

そして、カスタムパターン文字列が指定された型であるかどうかをチェックします。

func ~= (pattern: LineType, value: String) -> Bool { 
    return value.isOfType(pattern) 
} 

最後に、この例でテストしてみましょうル:

let testLine = "event:yada-yada-yada" 

switch testLine { 
case _ where testLine.characters.count == 0: 
    print("Empty") 
case LineType.Event: // <--- Causes the error Enum case 'Event' is not a member of type 'String' 
    print("Event") 
case LineType.Data: // <--- Causes the error Enum case 'Data' is not a member of type 'String' 
    print("Data") 
default: 
    print("Unknown Type") 
} 

だから、誰かが...私が間違って何をすべきか、事前に

感謝を私に伝えることができます。

+2

バグのように見えますが、パターンが列挙型の場合はコンパイルできません。 –

+2

@MartinR case {LineType.Event}():print( "Event")は問題を解決します...定数をよりよく定義するe = LineType.Event; ...場合e:... – user3441734

答えて

2
switch testLine { 
case _ where testLine.characters.count == 0: 
    print("Empty") 
case _ where testLine.isOfType(.Event): print("Event") 
case _ where testLine.isOfType(.Data): print("Data") 
default: print("Unknown Type") 
} 

/* prints 
Event 
*/ 

まだ、それを再配置してみてください...

予想通り、それはひどい見えますが、これは動作します

enum LineType : String { 
    case Event = "event:" 
    case Data = "data:" 
} 
func ~= (pattern: LineType, value: String) -> Bool { 
    return value.hasPrefix(pattern.rawValue) 
} 


let testLine = "event:yada-yada-yada" 
let e = LineType.Event 
let d = LineType.Data 
switch testLine { 
case let s where s.characters.count == 0: print("Empty") 
case e: print("Event") 
case d: print("Data") 
default: print("Unknown Type") 
} 
/* prints 
Event 
*/ 

これも

... 
case { return LineType.Event }(): print("Event") 
... 

または

を動作するはずです
... 
case { LineType.Event }(): print("Event") 
... 
+1

ありがとう、これは私が避けようとしているものです。カスタムパターンマッチングではないからです。カスタムパターンマッチングの原則は、毎回それを書かない 'switch case'の'〜= '関数を呼び出すことです。とにかくありがとう。 – Zaphod

+0

@Zaphod私の更新を参照してください。カスタムオペレータを使用するメリットはありません。 – user3441734

+0

実際、 '〜='演算子は 'switch case'パターンマッチングに関係する演算子です。あなたはそれを書く必要はありません。質問の始めにリンクを見てください。 – Zaphod

0

はい、解決策はありません。.rawValue。しかし、あなたはすでにそれを行う方法を知っています。

私はこれをプレイグラウンドで(Xcode 7.3を使用して)テストしましたが、これは動作しないことを確認できます。関係する機能にpublic修飾子を追加しても役に立ちませんでした。私はApple Bug Reporter、またはより良いのは、Swift Bug Reporter(@OleBegemannの示唆)のバグレポートを提出することをお勧めします。

+0

https://bugs.swift.org/でバグを報告する方が良いでしょう。 –

+0

@OleBegemann:私は同意します!私の答えを更新しました。 –

+0

お互いに感謝します。 {}()の回避策は動作しますが、期待される動作ではないので、私は両方のプラットフォームに報告します。 – Zaphod

関連する問題