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
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to