Ios 枚举案例'';不是类型为';的成员';

Ios 枚举案例'';不是类型为';的成员';,ios,swift,Ios,Swift,我有一个枚举: enum State { case FullOpen case HalfOpen case Closed } 该代码: var stateForConversionView: State! ... var previousState: State! if true { previousState = stateForConversionView! switch previousState { case .FullOpen:

我有一个枚举:

enum State {
    case FullOpen
    case HalfOpen
    case Closed
}
该代码:

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
    }
}
每个switch语句都有一个错误:

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

我真的不明白为什么。有人能给我解释一下吗?

这样就可以了:

if true {
    previousState = stateForConversionView

    switch previousState! {
    case .FullOpen:
        stateForConversionView = .HalfOpen
    case .HalfOpen:
        stateForConversionView = .FullOpen
    case .Closed:
        stateForConversionView = .HalfOpen
    default:
        break
    }
}
您需要添加


有关更多信息,请参阅。

如果条件变量处于不同类型的“状态”。您应该使用rawValue属性

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

        }

您不需要创建临时变量(
previousState
)。只需展开用作枚举的属性:

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

@DharmeshKheni希望您能为我澄清一下:如果
先前的状态
被声明为已展开,为什么他需要在
开关
中再次展开才能使其工作?谢谢。@Unheilig您可以通过此链接找到原因:>
您需要添加<我很想听听为什么
是这个答案的一部分。作为Unheilig,我还想知道为什么当它被声明为unwrapped时,显式的unwrapping是必要的。也许@mattt可以向我们解释这一点?我也很好奇为什么会这样,我找到了另一个答案——我想我会把它链接到这里,以防其他人遇到这个解决方案,并想知道为什么看起来冗余的展开是必要的@pkamb基本上不建议将枚举类型变量声明为任何类型的变量选项,因为枚举设计为始终具有已定义的状态。如果隐式展开可选
状态,则为事件,您仍然需要添加
答案与@DharmeshKheni不完全相同,因为不需要创建临时变量并将其展开以解决问题。您只需要打开用作枚举的属性。变量不是临时的,这是一个简化的示例。@Sulthan这是什么<代码>。。。previousState=stateForConversionView开关previousState!{…
当你需要写更多的代码时,什么东西被简化了?我看到了这一点,并且在我的实现中意识到我不需要这么做。这就是我为什么写这个答案的原因。而且,你节省了CPU和内存,即使它很小。