8.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для выполнения других действий, таких как поднятие исключения.
Далее: Протокол быстрого перечисления, Предыдущий: Синтаксис быстрого перечисления, подобный c99, Наверх: Быстрое перечисление [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Fast-enumeration-details.html