2017-07-13 7 views

答えて

4

あなたはwhere述語で例を使用することができます:あなたが本当に望んでいた場合、あなたは==を呼び出すパターンマッチ演算子(~=)を定義することができ

let array = ["A", "B"] 

switch array { 
    case _ where array == ["A", "B"]: print("AB") 
    case _ where array == ["C", "D"]: print("CD") 
    default: print("default") 
} 

switch文はcaseが一致しているかどうかを判断するために与えられたパターンと候補を受け入れるパターンマッチ演算子の定義を探します。

let array = ["A", "B"] 

func ~= <T: Equatable>(pattern: [T], candidate: [T]) -> Bool { 
    return pattern == candidate 
} 

switch array { 
    case ["A", "B"]: print("AB") 
    case ["C", "D"]: print("CD") 
    default: print("default") 
} 

それはどうかはっきりしていないので、私はしかし、この、反対アドバイスを希望このような場合は==チェック、contains(_:)hasPrefix(_:)などを実行しています。

+0

"func〜= ...."コードはどこに行きますか? Array型の拡張の中で宣言されるべきですか?またはそれはちょうど "どこに行く"とそのコード内で私はそれが[文字列]型のチェックする必要がありますか?実際の例を投稿してもよろしいですか? – Pochi

+0

@Pochi私は2つの実例を投稿しました... '〜='関数は、Array上の拡張モジュール内のスタティックメンバでも、グローバルスコープ内のスタンドアロン関数としても構いません。 – Alexander

+0

ああ、私はちょうど遊び場で試しました。私が理解していないことは、どのように "func(〜=)"がそのスコープを知っているかということです。私のファイルでこれを宣言すると、すべてのスイッチの比較に影響しますか?これは他のタイプに影響しないでしょうか?配列拡張内の静的メンバーとして宣言すると、より安全になりますか? (申し訳ありません、前にこのパターン一致するものは見たことがありません) – Pochi

2

さまざまな種類のスイッチを切り替えることはできますが、すぐに使用するアレイとは一致しません。 〜=を適切にオーバーロードして配列をマッチングさせることができます

func ~=<T: Equatable>(lhs: [T], rhs: [T]) -> Bool { 
    return lhs == rhs 
} 

let ArrayA = ["A","B"] 
switch ArrayA { 
case (["A","B"]): 
    print("true") 
default: 
    print("false") 
} 
+0

私はこれが存在していたのか知​​らなかった...笑。 https://stackoverflow.com/questions/38371870/operator-in-swift – Pochi

関連する問題