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-9.5.0/gcc/Fast-enumeration-details.html