This is nice, but it doesn’t solve the issue at hand because there is only one 
enum value. I would like to have something like:

        if value == .TWO { … }

I can’t use this == operator for this because I’d have to create:

        if value == .TWO(str) { … }

But I don’t have a specific str, and I want the condition to be true no matter 
what the value of str is.

Andy


> On Jan 17, 2017, at 10:53 PM, Rien <r...@balancingrock.nl> wrote:
> 
> A guy named Matthias recently commented this on my blog:
> 
> func == (left: Enum3, right: Enum3) -> Bool {
> switch (left, right) {
> case (.ONE, .ONE):
> return true
> case (.TWO(let str1), .TWO(let str2)):
> return str1 == str2
> default:
> return false
> }
> }
> 
> http://swiftrien.blogspot.nl/2015/05/swift-enum-compare-design-pattern.html
> 
> Regards,
> Rien
> 
> Site: http://balancingrock.nl
> Blog: http://swiftrien.blogspot.com
> Github: http://github.com/Swiftrien
> Project: http://swiftfire.nl
> 
> 
> 
> 
>> On 18 Jan 2017, at 01:15, Andy Chou via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> Enums with associated values can be very useful in Swift, but once you add 
>> associated values you lose some properties, especially equality:
>> 
>> ```
>> enum AuthenticationResponse {
>>   case success
>>   case alert(Alert)
>>   case reauthenticate
>> }
>> ```
>> 
>> Testing for a specific case requires a switch statement or the if pattern 
>> match syntax:
>> 
>>      if case .success = response { … }
>> 
>> But while this works well for control flow, it doesn’t work well for cases 
>> where we want a Bool, such as assert(). There are also common situations 
>> with lists and libraries like RxSwift where a filtering function uses a Bool 
>> valued closure. In these situations the best we can do is write functions 
>> like:
>> 
>> ```
>> enum AuthenticationResponse {
>>   case success
>>   case alert(Alert)
>>   case reauthenticate
>> 
>>   var isSuccess: Bool {
>>       if case .success = self {
>>           return true
>>       } else {
>>           return false
>>       }
>>   }
>> 
>>   var isReauthenticate: Bool {
>>       if case .reauthenticate = self {
>>           return true
>>       } else {
>>           return false
>>       }
>>   }
>> 
>>   var isAlert: Bool {
>>       if case .alert(_) = self {
>>           return true
>>       } else {
>>           return false
>>       }
>>   }
>> }
>> ```
>> Any suggestions better than writing out each of these functions explicitly?
>> 
>> The conditional conformances proposal coming in Swift 4 solves some of this 
>> issue, but not completely. If Alert isn’t Equatable, it is still useful to 
>> test whether the result is .success.  For example:
>> 
>>      assert(response == .success)
>> 
>> This is perfectly intelligible and I would argue that equality should be 
>> defined for enums with associated values omitted:
>> 
>>      assert(response == .alert)
>> 
>> Here we are ignoring the associated values, and merely checking if the enum 
>> case is the same.
>> 
>> Andy
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to