2017-10-17 58 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. 
~~^~~ 

譯文:如果您的枚舉使用關聯的值,則無法測試它的等效性。

注意:如果刪除了.aMoreComplexCase(和相應的測試),則代碼將按預期工作。

看起來像過去人們已經決定使用運算符重載來解決這個問題:How to test equality of Swift enums with associated values。但現在我們有了Swift 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) 
} 

,編譯器會合成一個合適的==運營商。