2017-10-17 5 views
2

で関連する値を列挙例等価をテストすることがあります。これらはすべて、このエラーが発生する、悲しいことどのように私はこのように、列挙型のカップルの変数の等価性をテストしたいと思いスウィフト4

enum AnEnumeration { 
    case aSimpleCase 
    case anotherSimpleCase 
    case aMoreComplexCase(String) 
} 

let a1 = AnEnumeration.aSimpleCase 
let b1 = AnEnumeration.aSimpleCase 
a1 == b1 // Should be true. 

let a2 = AnEnumeration.aSimpleCase 
let b2 = AnEnumeration.anotherSimpleCase 
a2 == b2 // Should be false. 

let a3 = AnEnumeration.aMoreComplexCase("Hello") 
let b3 = AnEnumeration.aMoreComplexCase("Hello") 
a3 == b3 // Should be true. 

let a4 = AnEnumeration.aMoreComplexCase("Hello") 
let b4 = AnEnumeration.aMoreComplexCase("World") 
a3 == b3 // Should be false. 

error: MyPlayground.playground:7:4: error: binary operator '==' cannot be applied to two 'AnEnumeration' operands 
a1 == b1 // Should be true. 
~~^~~ 

MyPlayground.playground:7:4: note: binary operator '==' cannot be synthesized for enums with associated values 
a1 == b1 // Should be true. 
~~^~~ 

翻訳:この1のようなあなたの列挙が関連付けられている値を使用している場合は、同等のためにそれをテストすることはできません。

.aMoreComplexCase(および対応するテスト)が除去された場合に予想されるように、コードが動作します。

過去の人にこの問題を回避するために演算子オーバーロードを使用することを決定したように見えます:How to test equality of Swift enums with associated values。しかし、私たちはスイフト4を持っているので、もっと良い方法があるのだろうか?または、リンクされたソリューションを無効にする変更があった場合は、

ありがとうございます!

+3

これらの回答は引き続き有効です。 https://github.com/apple/swift-evolution/blob/master/proposals/0185-synthesize-equatable-hashable.mdが実装されているとシンプルになります。 –

+0

これは私が必要なものです。私はコードが正常に動作しています。おそらく、あなたはこのコメントを答えにする必要があるでしょう。 – MadEmperorYuri

答えて

2

が受け入れられ、スウィフト4.1(Xcodeの9.3、現在ベータ版で )に実装されていスウィフト提案:

...合成すべてのメンバがEquatable/Hashableである場合、Equatable/Hashableへの適合。

したがって、オプトイン自動合成への要件のいずれかを実施することなくEquatableまたはハッシュ可能としてのタイプを宣言することによって...

すればよいです。あなたの例では

からStringEquatableあるので、 - それは

enum AnEnumeration: Equatable { 
    case aSimpleCase 
    case anotherSimpleCase 
    case aMoreComplexCase(String) 
} 

を宣言するために十分であろうと、コンパイラは、適切な==オペレータを合成します。

関連する問題