2015-06-27 16 views
48

Mam ENUM:Enum przypadek '...' nie jest członkiem typu '...'

enum State { 
    case FullOpen 
    case HalfOpen 
    case Closed 
} 

i ten kod:

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

Mam błąd na każdy 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!' 

Nie do końca rozumiem dlaczego. Czy ktoś może mi wyjaśnić?

+3

Zasadniczo nie zaleca się deklarować zmienne typu enum jak wszelkiego rodzaju optionals ponieważ enum jest zaprojektowany, aby zawsze mieć określony stan. – vadian

+2

Zdarzenie, jeśli jest niejawnie rozwinięty opcjonalnie 'Stan!', Nadal musisz dodać '!' – onmyway133

Odpowiedz

114

ten sposób będzie ona działać prawidłowo:

if true { 
    previousState = stateForConversionView 

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

Trzeba dodać !.

Więcej informacji można znaleźć pod numerem THIS.

+0

... Zapomniałem tego ... Dzięki :) – Nico

+0

Chętnie Ci pomożemy .. :) –

+6

@DharmeshKheni Miał nadzieję, że możesz wyjaśnić dla mnie: jeśli 'previousState' jest zadeklarowany jako unwrapped, dlaczego musiałby ponownie rozwinąć w' switch', aby to działało? Dzięki. – Unheilig

0

Jeśli zmienna warunku jest innego rodzaju niż "Stan". Powinieneś użyć właściwości 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 

     } 
-2

Nie trzeba tworzyć zmiennej tymczasowej (previousState). Wystarczy rozpakować tę właściwość, że używasz jako ENUM:

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

Już zostało wysłane przez @DharmeshKheni – user5226582

+0

to nie jest dokładnie ta sama odpowiedź niż @DharmeshKheni, ponieważ jest nie jest konieczne utworzenie zmiennej tymczasowej i rozwinięcie jej w celu rozwiązania problemu. Musisz tylko rozwinąć właściwość, której używasz jako elementu wyliczającego. –

+0

Zmienna nie jest tymczasowa, jest to uproszczony przykład. – Sulthan

Powiązane problemy