[БЕЗ_ЗВУКА] Привет! Эта лекция будет посвящена перечислениям, их созданию и использованию в Swift. Расскажу, как с ними работать и с какими особенностями вы столкнетесь при разработке. Перечисление, или Enumeration, определяет тип для группы схожих значений. В C и Objective-C перечисления связывают имена с целочисленными значениями. В Swift этот тип был значительно расширен и позволяет реализовывать больше возможностей. В качестве значений вы можете использовать строки, символы, целые числа и числа с плавающей точкой. Помимо этого можно использовать ассоциированные значения любого типа. По-своему перечисления являются типом высшего класса. В них могут использоваться возможности, поддерживаемые классами, например, вычисляемые свойства и методы. Для перечислений могут быть определены инициализаторы, а функционал может быть расширен за счет extensions и поддержки протоколов. Синтаксис для создания перечислений и добавления значений показан на слайде. В Swift по умолчанию перечислениям не назначаются целочисленные значения. То есть значениям в перечислении из примера не будут соответствовать числа 0, 1, 2 и так далее. Для удобства значения одного типа можно определить на одной строке. Создание перечислений эквивалентно объявлению нового типа. Как и для других типов, принято использовать UpperCamelCase — синтаксис для именования, а имена даются в единственном, а не множественном числе. После того как переменная с указанным типом была объявлена, можно использовать краткую запись при присвоении. В switch-выражении рассматривается значение переменной, а в кейсах используется значение, которое может принимать данное перечисление. Как и в других случаях использования switch, должны быть перечислены все возможные значения, либо добавлен дефолт — случай для остальных. В перечислениях могут использоваться ассоциированные значения любого типа. Часто это оказывается полезным для хранения информации совместно с обычными значениями. Для каждого кейса можно использовать свой тип. Например, для хранения информации о цвете мы можем задействовать кортежи, для обозначения RGB или CMYK кодировки, а также строку для удобного и понятного пользователям обозначения. Для проверки значений можно также использовать switch. Каждому значению перечисления присваивается переменная или константа для использования внутри switch. С примером вы можете ознакомиться на слайде. В качестве альтернативы ассоциированным значениям в перечислении могут использоваться raw values. Значения могут быть типов Int, Float, String или Character. В отличие от associated raw values устанавливаются в момент определения перечисления. Соответственно associated value устанавливается в момент создания константы или переменной. Если raw value является типом Int или String, то явного присвоения raw-значения для каждого кейса не требуется. Например, если для перечисления указан тип Int, то все кейсы будут иметь соответствующее raw-значение, начиная с 0, либо начиная с того значения, которое вы указали самостоятельно. Для перечисления типов String каждому кейсу будет соответствовать такое же значение с типом String. Если создали перечисление с raw-значениями, то будет автоматически сгенерирован соответствующий инициализатор. В качестве параметра для инициализатора передается одно из raw-значений. Так как создание проводится во время выполнения программы, может быть передано несуществующее raw-значение. Поэтому инициализатор возвращает optional кейс для перечисления. Такие инициализаторы называются Failable. Использование выражения if let позволяет выполнить проверку инициализированного значения. В некоторых случаях вам необходимо включить другое перечисление в качестве associated value. В такой ситуации у нас возникает проблема с расчетом необходимого количества памяти для инстанса перечисления, так как на этапе компиляции проблематично определить количество рекурсивных использований для перечисления. Решить проблему можно при помощи ключевого слова indirect. Это позволит выделять память под перечисления динамически. Использовать indirect можно перед всем перечислением либо перед конкретным кейсом с ассоциированным значением. Как видите, перечисления получили множество улучшений по сравнению с C и Objective-C. Решать задачи по описанию деревьев или созданию структуры данных стало проще, а код — легче для восприятия. В следующих уроках мы расскажем о том, как построена работа с памятью для перечислений классов и структур.