8.9.3 Подробное описание быстрого перечисления
Вот более техническое описание с подробными данными. Рассмотрим код
for (object expression in collection expression)
{
statements
} вот что происходит при его запуске:
-
выражение коллекции вычисляется ровно один раз, и результат используется в качестве объекта коллекции для итерации. Это означает, что можно безопасно писать код, такой как
for (object in [NSDictionary keyEnumerator]) .... - итерация реализуется компилятором путем многократного получения партий объектов из объекта коллекции с использованием протокола быстрого перечисления (см. ниже), а затем итерации по всем объектам в партии. Это быстрее, чем обычное перечисление, где объекты извлекаются по одному (отсюда и название «быстрое перечисление»).
- если в коллекции нет объектов, то выражение объекта устанавливается в значение
nilи цикл немедленно завершается. - если в коллекции есть объекты, то для каждого объекта в коллекции (в порядке их возврата) выражение объекта устанавливается в объект, а затем выполняются операторы.
-
операторы могут содержать
breakиcontinueкоманды, которые прервут итерацию или перейдут к следующей итерации цикла, как ожидается. - когда итерация завершается, потому что больше нет объектов для итерации, выражение объекта устанавливается в значение
nil. Это позволяет определить, завершилась ли итерация из-за использования командыbreak(в этом случае выражение объекта останется установленным в последний обработанный объект) или потому, что она прошла по всем объектам (в этом случае выражение объекта будет установлено вnil). -
операторы не должны вносить никаких изменений в объект коллекции; если это произойдет, это ошибка, и быстрое перечисление завершится вызовом
objc_enumerationMutation, функции времени выполнения, которая обычно прерывает программу, но может быть настраиваема библиотеками Foundation черезobjc_set_mutation_handlerдля выполнения других действий, таких как возбуждение исключения.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Fast-enumeration-details.html