9.9.3 Подробное описание быстрого перебора
Ниже приведено более техническое описание со всеми подробностями. Рассмотрим код
for (object expression in collection expression)
{
statements
}
вот что происходит при его выполнении:
-
collection expressionвычисляется ровно один раз, а результат используется в качестве объекта коллекции для перебора. Это означает, что можно безопасно писать код, напримерfor (object in [NSDictionary keyEnumerator]) …. - компилятор реализует перебор, многократно получая пакеты объектов из объекта коллекции с помощью протокола быстрого перебора (см. ниже), а затем перебирая все объекты в пакете. Это быстрее, чем обычный перебор, при котором объекты извлекаются по одному (отсюда и название «быстрый перебор»).
- если в коллекции нет объектов, то
object expressionприсваивается значениеnil, и цикл немедленно завершается. - если в коллекции есть объекты, то для каждого объекта коллекции (в порядке их возврата)
object expressionприсваивается этот объект, а затем выполняютсяstatements. -
statementsможет содержать командыbreakиcontinue, которые, как и ожидалось, прерывают перебор или переходят к следующей итерации цикла. - когда перебор заканчивается, потому что больше нет объектов,
object expressionприсваивается значениеnil. Это позволяет определить, завершился ли перебор из-за использования командыbreak(в этом случаеobject expressionостанется равным последнему перебранному объекту) или потому, что были перебраны все объекты (в этом случаеobject expressionбудет равноnil). -
statementsне должны вносить никаких изменений в объект коллекции; в противном случае возникает серьёзная ошибка, и быстрый перебор завершается вызовом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-15.3.0/gcc/Fast-enumeration-details.html