Перечисляемые типы не могут быть расширены без добавления дополнительных записей в самом перечисляемом типе. Таким образом, невозможно иметь содержимое перечисления, которые оба обрабатываются как формальный член перечисляемого типа, но также не видны при обычной компиляции.
Взять, к примеру, CoreAnimation. Могут быть значения, которые используются внутри компании, которые не поддерживаются или не доступны через открытый API по ряду причин; сразу приходит на ум "деталь реализации".
Кроме того, строки как константы позволяют расширение, как подразумевает Eli. Они также имеют тенденцию быть намного более информативными при отладке. «kCAGravityTop» гораздо более показателен, чем, скажем, «4».
С точки зрения производительности очень мало штрафов за использование строк. Статические строки, из которых фактически состоит внутренняя копия каждого внешнего объявления почти каждой строковой константы, эффективно обрабатываются компилятором, и первый тест -isEqualToString: метода - это равенство указателей - очень быстро. Не так быстро, как switch (), но, учитывая величину выполнения кода, подразумеваемую константой, разница в несколько циклов между switch () и сравнением строк не имеет значения.