Как и зачем использовать Labeled Statements в Swift? | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Team Lead
-6%
Архитектура и шаблоны проектирования Разработчик IoT
-13%
C# Developer. Professional
-9%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Professional JavaScript Developer. Professional Базы данных Android Developer. Professional Framework Laravel Cloud Solution Architecture Highload Architect Reverse-Engineering. Professional Vue.js разработчик Agile Project Manager VOIP инженер Scala-разработчик Супер-практикум по использованию и настройке GIT Symfony Framework Java Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Дизайн сетей ЦОД
-13%
NoSQL Основы Windows Server MS SQL Server Developer Инфраструктурная платформа на основе Kubernetes Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Как и зачем использовать Labeled Statements в Swift?

iOSbasic_Deep_27.9-5020-a4efb9.png

Перед написанием данной статьи я спросил в нескольких iOS-чатах про эту фичу Swift, однако никто из iOS-разработчиков вообще(!) не знал о существовании Label Statements. В одной из прошлых заметок, где мы разбирали, какие есть типы Предписаний (Statements) в Swift, были упомянуты Control Flow Statements. Вот именно на управляющие потоком выполнения предписания и можно поставить лейблы.

Зачем?

Некоторые сравнивают Label Statements с некоторой «огламуренной» разновидностью GOTO. Нагляднее всего это можно показать на двух вложенных Control Flow Statements, например на циклах:

let arrVeggies = ["eggplant", "cauliflower", "potato"]
let arrColors = [0xffffff, 0x000000]

vegLabel: for veg in arrVeggies {
    print(veg)
    for col in arrColors {
        if veg == "cauliflower" && col == 0x000000 {
            continue vegLabel
        }
        print(String(col, radix: 16))
    }
}

Перед первым циклом мы вставили vegLabel. Это дало нам возможность вызвать во втором цикле continue vegLabel, что продолжило выполнение arrVeggies. В итоге мы получили такой результат:

eggplant
ffffff
0
cauliflower
ffffff
potato
ffffff
0

На реальных проектах таким образом вы сможете оптимизировать производительность сложных вложенных циклов.

Давайте ещё рассмотрим пример с break

Работая в геймдеве, мне часто приходилось обходить 2-х мерные массивы, которые являются представлением 2D карты:

// ┌──▶ x
// │
// ▼
// y
let treasureIsland4x4 = [
["empty", "empty", "empty", "empty"],
["empty", "empty", "empty", "empty"],
["empty", "empty", "empty", "empty"],
["treasure", "empty", "empty", "empty"]
]

yScan: for (y, xRow) in treasureIsland4x4.enumerated() {
    // x Scan
    for (x, value) in xRow.enumerated() {
        if value == "treasure" {
            print("Found at x=\(x), y=\(y)")
            break yScan
        }
    }
}

Результат будет:

Found at x=0, y=3

Массив мы предопределили литералами и «закопали» сокровище в начале последнего вложенного x массив. Если во вложенном цикле мы напишем break, то мы просто выйдем из x Scan цикла и нам придётся писать или условие со вторым break, или отдельную функцию с return.

Благодаря Label Statement мы сразу прерываем первый цикл. При написании оптимизированных алгоритмов вложенность бывает выше 2-х мерной и лейблы нам помогут сделать выполнение быстрее, а код короче.

Кроме циклов, лейблы можно ставить и на другие Control Flow Statements: На while-циклы:

whileLabel: while condition == true {
    
}

На repeat-while-циклы:

repeatLabel: repeat {
    
} while condition == true

На if-предписание:

ifLabel: if condition == true {
    
}

На switch-предписание:

switchLabel: switch condition {
    
}

Остались вопросы? Пишите их в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться