Знайте важность присвоения имен петлям

На мой взгляд, Swift - язык программирования для начинающих.

Подумайте о нескольких вещах, которые есть / отсутствуют в Swift:

  • Нам не нужно обрабатывать указатели, указывающие на адреса памяти.
  • Существует автоматический подсчет ссылок (ARC), который заботится о подсчете ссылок на объекты и автоматически освобождает их, когда ссылок не остается.
  • Необязательные параметры заставляют нас обрабатывать необязательные значения с большей осторожностью и думать о случаях, когда необязательное значение не установлено.
  • И т.п.

Тем не менее, у Swift есть свои скрытые сокровища. Недавно я наткнулся на одну из них, читая The Swift Programming Language: помеченные утверждения.

По сути, они позволяют вам давать имена вашим операторам, что может оказаться полезным при работе с циклами или switch операторами.

В этой статье я покажу вам, как называть ваши утверждения и почему вы должны их вообще давать.

Но давайте начнем с проблемы, которую решают помеченные утверждения.

Что нам пришлось бы делать без помеченных заявлений

Представьте, что вы работаете над поиском сотрудников компании. У вас есть некоторая форма базы данных, и вы разделяете всех сотрудников по их отделам.

Теперь вам нужно найти хотя бы одного члена по имени. Для простоты мы проигнорируем случай, когда два члена имеют одно и то же имя.

Итак, у вас есть строка с именем сотрудника. Вы сразу же придумываете решение, которое выполняет итерацию по отделам с помощью цикла for, а внутри этого цикла находится еще один цикл for, который повторяется по всем членам этого отдела.

Решение могло выглядеть так:

Вы можете создать пустую игровую площадку и протестировать ее. Вот что на самом деле выводится на консоль:

We weren't able to find the person E. Neville in Human Resources
The employee was found in Development!
We weren't able to find the person E. Neville in Development
We weren't able to find the person E. Neville in Sales

Первый журнал был запущен, потому что мы не можем найти E. Невилл из отдела кадров. Второе утверждение сигнализирует о том, что мы нашли нашего сотрудника в отделе разработки.

Тем не менее, мы по-прежнему запускаем последний print оператор для этого отдела. То же самое и с последним отделом. Даже когда мы уже нашли члена, которого искали, мы все равно не останавливаем запуск петель.

Нам нужна какая-то форма отмены.

Теперь вы можете придумать такое решение:

Мы используем логическую переменную employeeFound, чтобы определить, есть ли совпадение. Мы можем использовать break, чтобы выйти из внутреннего цикла. С помощью нашей переменной, которая становится true, когда мы находим наш член, мы также прерываем внешний цикл.

Это может помочь нам решить проблему, но это далеко не изящно. Нам нужны два оператора break, оператор if и переменная, которую нужно правильно обновить.

Мы можем лучше.

Как помеченные утверждения помогают нам писать краткий код

Давайте теперь посмотрим на тот же пример, но на этот раз мы будем использовать помеченные утверждения:

Вы видите, что я там делал?

Я присвоил внешнему циклу метку (departmentLoop). Для этого ярлыка не требуется ключевое слово var или let. Это может быть просто имя с двоеточием. С этого момента мы можем использовать его для выхода из этого цикла.

Мы используем его внутри цикла employee, чтобы сообщить Swift, что мы не хотим выходить из внутреннего цикла, что было бы поведением по умолчанию. Вместо этого эта break команда предназначена для выхода из внешнего цикла.

Это устраняет необходимость в дополнительном операторе if в конце каждой итерации внешнего (department) цикла. Нам также не нужно отслеживать другую переменную и находить правильную позицию для ее изменения.

Вместо этого мы можем очень четко сообщить, от чего хотим избавиться.

Другие варианты использования помеченных заявлений

В приведенном выше примере показано, почему нам нужны помеченные операторы. Это позволяет нам писать меньше кода, который становится более читабельным.

Тем не менее, я знаю еще два варианта использования:

  1. Использование команды continue внутри циклов.
  2. Использование команд break в сочетании с оператором switch.

Кратко пройдемся по ним.

Команда continue также используется для циклов. В отличие от команды break, она не прерывает цикл и не останавливает его выполнение полностью. Он просто запускает другую итерацию, не выполняя никакого последующего кода.

Представьте, что у нас есть человек, который работает в нескольких отделах. Опять же, мы проигнорируем случай, когда у нас есть одно и то же имя в одном и том же отделе более одного раза.

Код может выглядеть так (\\ ... отмечает места, где вы должны сохранить код, как и раньше):

Теперь наш вывод на консоль выглядит так:

We weren't able to find the person E. Neville in Human Resources
The employee was found in Development!
The employee was found in Sales!

Вы можете добиться того же, просто используя оператор break без помеченного оператора. Однако, если у вас есть еще больше петель, это может пригодиться.

Наконец, для операторов switch вы также можете использовать помеченные операторы, чтобы выйти из следующих ситуаций:

  • Вы хотите выйти из внешнего switch оператора, содержащего цикл.
  • Вы хотите выйти из внешнего цикла, содержащего оператор switch.
  • Вы хотите прервать внешний switch оператор, содержащий другой switch оператор.

Давайте посмотрим на код switch примера:

Мы хотим найти нашу собаку по кличке Лаки. У нас есть switch внутри другого switch внутри цикла.

Когда мы находим животное вида dog и зовут его Счастливчиком, мы хотим не только выйти из внутреннего и внешнего переключателей, но и полностью выйти из цикла.

Это однострочник, когда мы используем помеченный оператор. Журнал выглядит так:

It was a different animal of species: cat
It was a dog but a different one
We found our dog Lucky!

Результат ожидаемый. Мы находим Lucky на третьей итерации цикла и после этого больше не выполняем итераций.

Заключение

Как вы уже знаете, помеченные утверждения - это инструмент для очень специфических ситуаций. Скорее всего, они вам не понадобятся ни ежедневно, ни даже еженедельно.

Однако наша работа как разработчиков состоит в том, чтобы иметь в своем арсенале широкий спектр инструментов и выбирать лучший из них для решения данной проблемы.

Помеченные операторы позволяют нам писать краткий код, когда мы хотим выйти из внешних циклов или switch операторов. Они просты в использовании и также должны быть частью вашего инструментария.

Это также показывает нам, что у Swift есть некоторые скрытые сокровища, которые мы редко видим и, возможно, даже не знаем. Так что никогда не переставайте изучать, что может предложить этот замечательный язык.

Спасибо за ваше время!