Как программист, вы будете работать со многими ситуациями, которые требуют от вас присвоения значений из ограниченного числа параметров. Представьте, что вы пишете программу, которая позволяет пассажирам выбирать место из трех вариантов: у окна, посередине и у прохода. В Swift вы бы сделали это с помощью перечисления.
Перечисление, или enum, - это специальный тип Swift, который позволяет вам представлять именованный набор параметров. В этом уроке вы узнаете, когда обычно используются перечисления, как определить перечисление и как работать с перечислениями с помощью операторов switch.
Что Вы Узнаете
- Почему перечисления являются полезным инструментом
- Как определить простые перечисления
- Как определить перечисления с необработанными значениями
- Как работать с перечислениями с помощью оператора switch
Словарь
Связанные Ресурсы
Руководство по языку программирования Swift: Перечисления
Перечисления определяют общий тип для группы связанных значений.
Рассмотрим направления в приложении компаса: север, восток, юг и запад. Приложение может помочь ориентировать пользователя в любом из этих четырех направлений. Стрелка компаса всегда указывает на север, но направление компаса изменяется по мере движения пользователя. Направление помогает пользователю определить, в какую сторону он смотрит.
Вы определяете новое перечисление с помощью ключевого слова enum. Код ниже определяет перечисление для отслеживания направления на компасе:
enum CompassPoint {
case north
case east
case south
case west
}
Перечисление определяет тип, а варианты case определяют доступные значения для этого типа. Наилучшей практикой является использование заглавных букв для имени перечисления и строчных букв для вариантов case.
Вы также можете определить доступные варианты, разделенные запятыми, в одной строке:
enum CompassPoint {
case north, east, south, west
}
Как только вы определили перечисление, вы можете начинать использовать его как любой другой тип в Swift. Просто укажите тип перечисления вместе со значением:
var compassHeading = CompassPoint.west
// Компилятор назначает `compassHeading` тип `CompassPoint` по выводу типа.
var compassHeading: CompassPoint = .west
// Компилятор назначает `compassHeading` тип `CompassPoint` из-за аннотации типа. Значение затем можно присвоить с помощью точечной нотации.
Теперь, когда тип compassHeading установлен, вы можете изменить значение на другую точку компаса, используя более короткую точечную нотацию:
compassHeading = .north
Управляющие конструкции
В уроке по управляющим конструкциям вы узнали, как использовать операторы if и switch для реагирования на значения типа Bool. Вы можете использовать ту же логику управляющих конструкций при работе с различными случаями перечисления.
Рассмотрим код ниже, который выводит разные предложения в зависимости от того, какое значение CompassPoint установлено в константу compassHeading:
let compassHeading: CompassPoint = .west
switch compassHeading {
case .north:
print(”I am heading north”)
case .east:
print(”I am heading east”)
case .south:
print(”I am heading south”)
case .west:
print(”I am heading west”)
}
Вы также можете использовать оператор if для выполнения кода при определенном значении перечисления. Например:
let compassHeading: CompassPoint = .west
if compassHeading == .west {
print(”I am heading west”)
}
Использование перечислений с управляющими конструкциями делает ваш код более читаемым и гибким, позволяя легко обрабатывать различные случаи и сценарии.
Преимущества безопасности типов
Перечисления особенно важны в Swift, потому что они позволяют представлять информацию, такую как строки или числа, безопасным с точки зрения типов образом.
Представьте набор данных, который представляет фильмы определенных жанров. До того, как вы узнали о перечислениях, вы могли бы определить простую структуру фильма следующим образом:
struct Movie {
var name: String
var releaseYear: Int?
var genre: String
}
Учитывая это определение, вы бы использовали String для задания жанра:
let movie = Movie(name: “Wolfwalkers”, releaseYear: 2020, genre: “Aminated”)
Вы заметили проблему в этом инициализаторе?
Многие разработчики на Swift сказали бы, что жанр (genre) является "строчно типизированным" вместо "строго типизированным". Они указывают на тот факт, что genre подвержен всем ошибкам, связанным со строковыми значениями, — и одной из них является неправильное написание. Представьте, что вы написали код для получения всех фильмов в жанре "Animated". Фильм Wolfwalkers будет упущен.
В качестве лучшей практики, вы могли бы присвоить genre значение из перечисления под названием Genre.
enum Genre {
case animated, action, romance, documentary, biography, thriller
}
struct Movie {
var name: String
var releaseYear: Int?
var genre: Genre
}
Теперь, создавая экземпляр фильма, вы будете использовать перечисление для жанра, что обеспечит безопасность типов и избавит от ошибок, связанных с неправильным написанием:
let movie = Movie(name: “Wolfwalkers”, releaseYear: 2020, genre: .animated)
Этот код гораздо менее подвержен ошибкам. Компилятор обеспечивает безопасность, требуя от вас выбора случая из перечисления Genre
при инициализации нового фильма.
Перечисления являются чрезвычайно мощным инструментом в Swift. Вы будете использовать их всякий раз, когда захотите добавить безопасность типов, там, где в противном случае могли бы использовать строки или числа. Вы продолжите изучать более сложные функции перечислений по мере работы с более сложными данными.
Лабораторная работа
Откройте и выполните упражнения в Lab—Enumerations.playground.
Связь с дизайном
Откройте свою рабочую тетрадь по дизайну приложений и просмотрите раздел "Прототип" для вашего приложения (или просмотрите сам прототип). Можете ли вы найти места, где ваше приложение могло бы использовать перечисление? Добавьте комментарии в раздел "Прототип" или на новый пустой слайд в конце документа.
В примере приложения "Go Green" в рабочей тетради разработчик может предоставить список возможных типов переработки, которые пользователь может выбрать. Везде, где используются типы переработки, перечисление обеспечит учет каждого выбора.
Отрывок из книги
Develop in Swift Fundamentals
Apple Education
https://books.apple.com/ru/book/develop-in-swift-fundamentals/id1581182804