2015-06-27 16 views
48

Ho un enum:caso Enum '...' non è un membro del tipo '...'

enum State { 
    case FullOpen 
    case HalfOpen 
    case Closed 
} 

e questo codice:

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

ho ottenuto un errore su ogni 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!' 

Non capisco davvero perché. Qualcuno può spiegarmi per favore?

+3

In sostanza non è raccomandato per dichiarare variabili di tipo enum come qualsiasi tipo di optional perché un enum è progettato per avere sempre uno stato definito. – vadian

+2

Event se è implicitamente scartare opzionale 'State!', È ancora necessario aggiungere '!' – onmyway133

risposta

114

questo modo funzionerà bene:

if true { 
    previousState = stateForConversionView 

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

è necessario aggiungere !.

Per ulteriori informazioni, fare riferimento a THIS.

+0

... Ho dimenticato questo ... Grazie :) – Nico

+0

Felice di aiutarti .. :) –

+6

@DharmeshKheni Speravo se potresti chiarire per me: se 'previousState' è dichiarato come unwrapped, perché avrebbe bisogno di scartarlo di nuovo in' switch' per farlo funzionare? Grazie. – Unheilig

0

Se la variabile di condizione è in un diverso tipo di "Stato". È necessario utilizzare la proprietà 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

Non è necessario creare una variabile temporanea (previousState). Basta scartare la proprietà che si sta utilizzando come enum:

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

Già pubblicato da @DharmeshKheni – user5226582

+0

non è esattamente la stessa risposta di @DharmeshKheni perché è non è necessario creare una variabile temporanea e scartarla per risolvere il problema. Hai solo bisogno di scartare la proprietà che stai usando come enum. –

+0

La variabile non è temporanea, è un esempio semplificato. – Sulthan

Problemi correlati