2

If I have

var currentState: TransformState = .Default
enum TransformState {
    case Default
    case Error(ErrorState)

    enum ErrorState {
        case Custom
        case Default
    }
}

var state = TransformState.Error(.Custom)

How can I check if state == currentState?

JAL
  • 41,701
  • 23
  • 172
  • 300
natecraft1
  • 2,737
  • 9
  • 36
  • 56
  • Override `==` for your enum. Possible duplicate of [How to test equality of Swift enums with associated values](http://stackoverflow.com/questions/24339807/how-to-test-equality-of-swift-enums-with-associated-values) – JAL Aug 02 '16 at 22:14
  • @JAL I saw that question and I was still confused because in my case it is nested enums. – natecraft1 Aug 02 '16 at 22:19

3 Answers3

3

You just need to implement Equatable for TransformState

TransformState.ErrorState gets it for free, so you can use that fact in your implementations:

extension TransformState: Equatable {}
func ==(lhs: TransformState, rhs: TransformState) -> Bool {
    switch (lhs, rhs) {
    case (.Default, .Default):
        return true

    case let (.Error(lhsErrorState), .Error(rhsErrorState)):
        return lhsErrorState == rhsErrorState

    default:
        return false
    }
}

Note that in Swift 3.0, you'll be able to put the operator overload inside the extension's body.

NiñoScript
  • 4,523
  • 2
  • 27
  • 33
1

Your issue is very similar to the thread shown by JAL, because your nest enum TransformState. ErrorState is Equatable.

You can write your own == like:

func == (lhs: TransformState, rhs: TransformState) -> Bool {
    switch (lhs, rhs) {
    case (.Default, .Default):
        return true
    case (.Error(let state1), .Error(let state2)):
        return state1 == state2
    default:
        return false
    }
}
var currentState: TransformState = .Default

var state = TransformState.Error(.Custom)

print(state == currentState) //->false

currentState = .Error(.Custom)
print(state == currentState) //->true
Community
  • 1
  • 1
OOPer
  • 47,149
  • 6
  • 107
  • 142
1

Override == for your enum.

func ==(lhs: TransformState, rhs: TransformState) -> Bool {
    switch (lhs, rhs) {
    case (.Default, .Default):
        return true

    case (.Error(.Custom), .Error(.Custom)):
        return true

    case (.Error(.Default), .Error(.Default)):
        return true

    default:
        return false
    }
}
JAL
  • 41,701
  • 23
  • 172
  • 300