Nico
Nico

Reputation: 6359

Enum case '...' is not a member of type '...'

I have an enum:

enum State {
    case FullOpen
    case HalfOpen
    case Closed
}

and this code:

var stateForConversionView: State!
...


var previousState: State!

if true {
    previousState = stateForConversionView!
    switch previousState {
    case .FullOpen:
        stateForConversionView = .HalfOpen
    case .HalfOpen:
        stateForConversionView = .FullOpen
    case .Closed:
        stateForConversionView = .HalfOpen
    default:
        break
    }
}

I got an error on each switch statement:

Enum case 'FullOpen' not found in type 'State!'
Enum case 'HalfOpen' not found in type 'State!'
Enum case 'Closed' not found in type 'State!'

I don't really understand why. Can someone explain me please?

Upvotes: 60

Views: 30472

Answers (4)

Паша Матюхин
Паша Матюхин

Reputation: 1153

You can add ? at the end of case state.

if true {
    previousState = stateForConversionView

    switch previousState {
    case .FullOpen?:
        stateForConversionView = .HalfOpen
    case .HalfOpen?:
        stateForConversionView = .FullOpen
    case .Closed?:
        stateForConversionView = .HalfOpen
    default:
        break
    }
}

or .some(Error)

if true {
    previousState = stateForConversionView

    switch previousState {
    case .some(.FullOpen):
        stateForConversionView = .HalfOpen
    case .some(.HalfOpen):
        stateForConversionView = .FullOpen
    case .some(.Closed):
        stateForConversionView = .HalfOpen
    default:
        break
    }
}

Upvotes: 0

Ginés SM
Ginés SM

Reputation: 233

You don't need to create a temporary variable(previousState). Just unwrap the property that you are using as enum:

if true {
    switch stateForConversionView! {
    case .FullOpen:
        stateForConversionView = .HalfOpen
    case .HalfOpen:
        stateForConversionView = .FullOpen
    case .Closed:
        stateForConversionView = .HalfOpen
    default:
        break
    }
}

Upvotes: -1

Dharmesh Kheni
Dharmesh Kheni

Reputation: 71854

This way It will work fine :

if true {
    previousState = stateForConversionView

    switch previousState! {
    case .FullOpen:
        stateForConversionView = .HalfOpen
    case .HalfOpen:
        stateForConversionView = .FullOpen
    case .Closed:
        stateForConversionView = .HalfOpen
    default:
        break
    }
}

You need to add !.

For more info refer THIS.

Upvotes: 132

Ahmed Lotfy
Ahmed Lotfy

Reputation: 3906

If the condition variable is in a different type of the "State". You should use rawValue property.

var previousState:String
previousState = stateForConversionView
 switch previousState {
        case State.FullOpen.rawValue:
            stateForConversionView = .HalfOpen
        case State.HalfOpen.rawValue:
            stateForConversionView = .FullOpen
        case State.Closed.rawValue:
            stateForConversionView = .HalfOpen
        default:break

        }

Upvotes: 3

Related Questions