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

IosSwift

Ios Problem Overview


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?

Ios Solutions


Solution 1 - Ios

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.

Solution 2 - Ios

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
            
        }

Solution 3 - Ios

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
    }
}

Solution 4 - Ios

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
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNicoView Question on Stackoverflow
Solution 1 - IosDharmesh KheniView Answer on Stackoverflow
Solution 2 - IosAhmed LotfyView Answer on Stackoverflow
Solution 3 - IosПаша МатюхинView Answer on Stackoverflow
Solution 4 - IosGinés SMView Answer on Stackoverflow