class MyClass
{
enum MyEnum {
case FirstCase
case SecondCase(Int)
case ThirdCase
}
var state:MyEnum!
func myMethod ()
{
if state! == MyEnum.FirstCase {
// Do something
}
}
}
Я получаю ошибку компилятора, указывающую на оператор if
::
Двоичный оператор '==' не может быть применен к двум операндам 'MyClass.MyEnum'
Если вместо этого я использую оператор switch
, проблем не будет:
switch state! {
// Also, why do I need `!` if state is already an
// implicitly unwrapped optional? Is it because optionals also
// are internally enums, and the compiler gets confused?
case .FirstCase:
// do something...
default:
// (do nothing)
break
}
Однако оператор switch
кажется слишком многословным: я просто хочу do something
вместо .FirstCase
и ничего другого. Оператор if
имеет больше смысла.
Что происходит с перечислениями и ==
?
EDIT: это очень странно. После выбора версии switch
и перехода к другим (совершенно не связанным) частям моего кода, а также возвращения, версия с оператором if
(сравнение принудительно-развернутого свойства с фиксированным регистром перечисления) компилируется без ошибок. Я могу только заключить, что это как-то связано с каким-то поврежденным кешем в парсере, который был очищен по пути.
EDIT 2 (спасибо @LeoDabus и @MartinR): кажется, что ошибка появляется, когда я устанавливаю связанное значение с другим регистром перечисления (не тем, с которым я сравниваю - в данном случае .SecondCase). Я до сих пор не понимаю, почему это вызывает именно эту ошибку компилятора («Невозможно использовать бинарный оператор '=='...») или что это значит.
viewDidLoad()
, и компилятор не может знать, инициализировано оно или нет. - person Nicolas Miari   schedule 06.11.2015==
по умолчанию. - person Martin R   schedule 06.11.2015Equatable
, как показано здесь: stackoverflow.com/a/25726677/59541 - person Nate Cook   schedule 06.11.2015