Опишите, как pattern matching в конструкции for обрабатывает коллекцию Optional-значений и что попадает в тело цикла.
Pattern matching в конструкции for проверяет каждый элемент коллекции по заданному шаблону. В тело цикла попадают только элементы, соответствующие шаблону; при сопоставлении с шаблоном извлечения Optional связанная переменная получает распакованное значение, а nil пропускается.
Такой подход появился как часть общей модели pattern matching в Swift: один механизм позволяет проверять структуру значения, извлекать связанные данные и отбрасывать неподходящие элементы. Для Optional это уменьшает количество ручных проверок nil и снижает риск принудительного извлечения.
Важно, что конструкция не изменяет коллекцию. Она управляет тем, какие элементы допускаются к выполнению тела цикла.
Коллекции часто содержат Optional-значения: например, результаты частично успешного преобразования или данные, где некоторые элементы отсутствуют. Обычный цикл потребовал бы отдельно проверять каждый элемент и извлекать его значение.
Ошибочное решение — принудительно извлекать Optional. При встрече с nil это приводит к аварийному завершению. Другая проблема — случайно передать в тело цикла сам Optional вместо содержащегося значения.
Шаблон Optional вида some проверяет, что значение присутствует, и одновременно связывает его содержимое с локальной переменной. В форме for case несоответствующие элементы не вызывают ошибку и не выполняют тело цикла — они просто пропускаются.
В этом примере будут напечатаны 10 и 30. Переменная value имеет тип Int, а не Int?, потому что шаблон уже доказал наличие значения.
Механизм эквивалентен последовательной проверке каждого элемента на соответствие шаблону, но не является преобразованием коллекции. Исходный массив остаётся неизменным, а область видимости связанной переменной ограничена телом цикла.
К конструкции можно добавить where, чтобы после успешного сопоставления применить дополнительное условие. Сначала выполняется извлечение по шаблону, затем проверяется условие where; это позволяет не обращаться к Optional внутри дополнительного предиката.
Сервис возвращает список возрастов, где часть значений не удалось распознать. Требуется отправить аналитику только корректные значения.
Вариант с обычным циклом явно проверяет каждый Optional, но содержит больше служебного кода и повышает риск принудительного извлечения. Вариант с compactMap создаёт новую коллекцию и удобен, если результат нужен для дальнейшей обработки, однако для однократного прохода добавляет отдельный этап преобразования.
Выбранный вариант — for case при непосредственной обработке элементов. Он выполняет фильтрацию и извлечение во время итерации, не меняет исходные данные и не требует промежуточного массива. Если же обработанные значения должны быть сохранены, compactMap обычно выразительнее.
for case дополнительные условия после извлечения?Да. После успешного сопоставления можно применить where, причём условие работает уже с распакованной переменной. Элементы, не соответствующие Optional-шаблону, отбрасываются до проверки where, поэтому дополнительное условие не получает nil.
for case отличается от compactMap для массива Optional-значений?for case выполняет выборку непосредственно во время обхода и не обязан создавать новый массив. compactMap строит новую коллекцию, удаляя nil и одновременно позволяя преобразовать остальные элементы. Поэтому compactMap удобнее для получения результата-коллекции, а for case — для потоковой обработки, побочных действий или раннего завершения цикла.
for case неподходящие элементы из исходной коллекции?Нет. Конструкция только определяет, какие элементы будут обработаны телом цикла. Исходная коллекция не мутирует, а связанная переменная является локальным результатом сопоставления текущего элемента. Чтобы получить изменённую коллекцию без nil, нужно явно создать её, например с помощью compactMap.