2015-06-27 4 views
48

У меня есть перечисление:Enum случай '...' не является членом типа "...

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!' 

Я действительно не понимаю, почему. Может кто-нибудь объяснить мне, пожалуйста?

+3

В основном это не рекомендуется объявлять переменные типа перечисления в любом виде, потому что опции перечисление предназначено всегда иметь определенное состояние. – vadian

+2

Событие, если он неявно разворачивает необязательный 'State!', Вам все равно нужно добавить '!' – onmyway133

ответ

114

Таким образом, он будет работать нормально:

if true { 
    previousState = stateForConversionView 

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

Вам нужно добавить !.

Для получения дополнительной информации обратитесь к THIS.

+0

... Я забыл об этом ... Спасибо :) – Nico

+0

Рад помочь вам .. :) –

+6

@DharmeshKheni Надеюсь, если вы могли бы уточнить для меня: если 'предыдущееState' объявлено как развернутое, зачем ему нужно снова распаковываться в' switch', чтобы сделать эту работу? Благодарю. – Unheilig

0

Если переменная условия находится в другом типе «состояния». Вы должны использовать свойство 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

Вам не нужно создавать временную переменную (previousState). Просто разворачивать свойство, которое вы используете в качестве перечисления:

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

Уже отправлено @DharmeshKheni – user5226582

+0

Это не совсем тот же ответ, чем @DharmeshKheni, потому что это не нужно создавать временную переменную и разворачивать ее для решения проблемы. Вам нужно только развернуть свойство, которое вы используете в качестве перечисления. –

+0

Переменная не является временной, это упрощенный пример. – Sulthan