Это имеет мало общего с Objective-C, но больше связано с C в Objective-C.В целом, использование enum для представления состояний вашего конечного автомата должно быть предпочтительнее простых чисел.
Причина, по которой вы не можете использовать классы в переключателе, заключается в том, что значение выражений, используемых в метках caseоператора switch необходимо знать во время компиляции.Предполагая, что [STATE_CLASS LOOPING_STATE]
является вызовом метода класса, компилятор не может безопасно знать результат этого выражения во время компиляции и, таким образом, откажется генерировать оператор switch.
Почему компилятору требуется знатьрезультат выражений, используемых для меток case во время компиляции?Идея оператора switch заключается в том, чтобы быть более эффективным, чем серия семантически эквивалентных блоков if / else if.Это достигается путем перевода оператора switch в таблицу диспетчеризации с безусловным переходом, тогда как решение if / else if требует большого количества условных переходов.Как можно легко догадаться, условные переходы принципиально расходятся с современными конвейерными процессорами, поскольку они могут привести к сбросу всего конвейера.(Современные процессоры пытаются компенсировать с помощью сложного предсказания ветвлений, но было бы лучше, если бы мы вообще могли избежать этой проблемы, верно?)
Но тогда сначала нужно сделать это правильно, а потом быстро.