Язык программирования Swift: история, особенности, перспективы
Swift появился в 2014 году. Создателем языка программирования является компания Apple. Согласно заявлениям официальных представителей, Свифт был заложен в платформе NeXT, которая выпускалась в начале 90-х годов прошлого столетия. Именно эта платформа и стала прародительницей современный iOS и macOS.
Разработкой текущей версии языка сотрудники Apple занимались еще с 2010 года. Примечательно, что этот язык не имеет как такового одного «родителя». Вместо этого, создатели Swift взяли понемногу от разных языков, например, Object-C, Haskell, Python, C#, CLU и ряда других.
Презентация Свифт состоялась в 2014 году. В это же время разработчикам стала доступна официальная документация по языку на 500 страницах печатного текста. Ровно спустя один год вышла вторая версия Swift. В отличие от первой она стала более производительной. В 2019 году вышла последняя на данный момент 5 версия ЯП.
С учетом того, что Свифт разработан не так давно, в нем учтены многие минусы, которые свойственным более древним языкам программирования. Например, Swift хорошо подходит для быстрого старта и развития.
При разработке этого ЯП команда преследовала такие цели, как простота изучения и ускорение цикла разработки. К тому же, в Свифт в отличие от Objective-C более простой и лаконичный синтаксис, что позволяет экономить время за счет написания меньшего количества кода.
Еще одна важная особенность – Swift имеет высокую производительность. Даже несмотря на то, что он является языком высокого уровня, нацеленным на быстрое освоение, он достаточно быстр. Согласно мнению его создателей, Swift почти в три раза быстрее Objective-C и почти в 8 раз быстрее, чем Python. Сейчас ведутся работы над тем, чтобы опередить по параметру скорости C++.
Помимо скорости, Свифт обладает еще одним важным преимуществом – наличие современных библиотек, фреймворков для написания функционального кода.
Язык Swift, как и большинство других ЯП полностью открыт и бесплатен. Причем он обладает открытым кодом. Несмотря на то, что в целом, в современных реалиях многие ЯП предлагают открытый код, именно для Apple это достаточно странно, так как обычно эта компания не делает подобных шагов. Однако такое поведение разработчика полностью оправданно. Вокруг языка практически сразу же образовалось большое коммьюнити, в рамках которого разработчики предлагают решения проблем, исправление багов и вносят какие-то полезные коррективы.
Еще одна отличительная черта Swift – безопасность. Благодаря многим новшествам, а также апгрейду синтаксиса, язык Свифт стал гораздо безопаснее obj-c. Например, через улучшения работы с памятью разработчики свели практически на нет возможности несанкционированного доступа к данным. Также, за счет более эффективной обработки сценариев, снизилось количество критических сценариев.
Важный момент, на который стоит обратить внимание – возможность визуализации результата. У Свифт есть специальная песочница – Playground, которая позволяет продемонстрировать работу программы. Иногда такой подход очень полезен, так как позволяет достаточно быстро найти проблемы в коде и сократить время разработки.
Где применяется Swift? Как уже отмечалось выше, язык создан для работы с платформами iOS и macOS. То есть он не является универсальным. Однако это не значит, что сферы применения этого ЯП сильно ограничены и спрос на разработчиков низкий.
С помощью Swift можно разработать любое приложение на мобильное устройство на базе iOS. Какое-то время назад ходили слухи, что на Свифт планируется перенести и Android. Однако пока что эта информация ничем не подтверждена. Тем более, что у Android разработчиков есть свои языки программирования и вряд ли такой глобальный перенос способствовал бы популяризации платформы.
Какие именно мобильные приложения можно разрабатывать с помощью Свифт? Если открыть App.Store и внимательно изучить содержимое, можно сделать вывод, что разработчики имеют неограниченное поле для фантазии. Здесь может быть все, от простейших виджетов для мобильных платформ на базе iOS и до сложнейших программ.
Есть ли у этого языка программирования недостатки? Да, и одним из них является то, что для взаимодействия с Objective-C используется специальный «мост», который очень сильно тормозит процесс сборки любого приложения. Также, к недостаткам этого языка можно отнести и то, что он постоянно меняется. С одной стороны это хорошо, с другой если бы Apple не выстроили процесс определенным образом, старый код мог бы не работать.
Стоит ли изучать Swift?
Если думаете, какой язык программирование изучить, советуем обратить внимание на Swift, и вот почему.
1. Что представляет собой Swift и почему он был так назван?
Swift – мощный и интуитивно понятный язык программирования для macOS, iOS, watchOS и tvOS, но отличается от Objective-C более широким набором возможностей, которые ограничивались связью с C. Кроме того, Swift можно назвать безопасным, поскольку язык имеет строгую типизацию: в любой момент времени вы точно знаете, с объектом какого типа вы работаете. Главным его преимуществом является скорость: как в работе над проектом, так и при запуске готового приложения. Именно за это преимущество перед другими языками (по заверениям создателей, он вобрал в себя всё лучшее от других языков программирования) его и назвали Swift (в переводе — быстрый).
2. Что стоит учить, Objective-C или Swift?
Этот вопрос широко обсуждался с момента появления Swift, но как и тогда, аргументов в пользу его изучения больше. Да и сама Apple не раз давала понять, что будущее — за Swift. При этом, его можно использовать параллельно с Objective-C, чтобы не возникало проблем с разными версиями. По этой же причине многие работодателю относятся серьезно к тому, что кто-то отказывается изучать Objective-C, считая, что Swift ещё достаточно сырой.
3. Почему Swift быстрее других языков? Может это неправда?

4. Я слышал, что учить Swift очень просто. Так ли это?
Можно сказать, что это так. Swift был разработан, чтобы новички в программировании могли легко начать создавать собственные приложения, поэтому научиться программировать невероятно легко. В Apple сравнивают своё детище с языком сценариев, а программисты с BASIC.
5. То есть я могу просто написать приложение и почти сразу загрузить его в App Store?
6. Раз всё так просто, как быстро я стану профессионалом?
Вообще говоря, это спорный вопрос. Swift постоянно совершенствуется, поэтому истинными экспертами являются лишь его создатели. Даже если вы сами создали несколько отличных приложений и освоили ряд продвинутых курсов и учебных пособий, вы всё равно не будете одним из лучших, а потому на собеседованиях говорят, что постоянно совершенствуются, а не достигли совершенства уже к этому моменту).
Во всяком случае, когда вы поиграетесь со Swift и прощупаете его, поймёте, нравится вам это или нет и приступите к работе над реальными проектами, тогда можно будет сказать, что вы по крайней мере стремитесь стать профессионалом. А вообще, всё зависит от вас.
7. А всё-таки, зачем было создавать новый язык, если старый был рабочим?
Когда-то, Objective-C был основным языком программирования Apple для написания приложений, ещё со времён OS X. Но за это время языки и практика программирования сильно изменились, особенно в области мобильной разработки. Вместо того, чтобы дорабатывать старое, Apple решила пойти другим путём и изменить сам подход разработчиков к работе, сделав процесс более интерактивным.
8. А как же то, что Swift ещё не доработан до конца?
Ну, не факт, что в ближайшие годы Apple закончит разработку Swift, ведь это будет означать его убийство. Здесь, как и в случае с любым новым языком, существует вероятность ошибок. Но всё постоянно обновляется, потому что это в интересах самой Apple. Кстати, в Google уже подумывают над возможностью запуска Swift-приложений на Apple, так что у него всё ещё впереди.
9. Я когда-то изучал языки программирования. На что похож этот язык?
Вероятнее всего, на Ruby или Python. Хотя здесь можно узнать и синтаксис из C.
10. Слышал что-то про какао. Можно подробнее?
Ну вот, теперь, когда вы знаете кое-что о Swift, вы можете подумать, стоит ли его изучать. Хотя наш совет — начать изучение как можно скорее, для этого помогут наши статьи:
Документация


Основы
Основы
Подобно C, Swift использует переменные для хранения и обращения к значениям по уникальному имени. Swift также широко использует переменные, значения которых не могут быть изменены. Они известны как константы, и являются гораздо более мощными, чем константы в C. Константы используются в Swift повсеместно, чтобы сделать код безопаснее и чище в случаях, когда вы работаете со значениями, которые не должны меняться.
В дополнение к знакомым типам, Swift включает расширенные типы, которых нет в Objective-C. К ним относятся кортежи, которые позволяют создавать и передавать группы значений. Кортежи могут возвращать несколько значений из функции как одно целое значение.
Swift также включает опциональные типы, которые позволяют работать с отсутствующими значениями. Опциональные значения говорят либо «здесь есть значение, и оно равно х», либо «здесь нет значения вообще». Опциональные типы подобны использованию nil с указателями в Objective-C, но они работают со всеми типами, не только с классами. Опциональные значения безопаснее и выразительнее чем nil указатели в Objective-C, и находятся в сердце многих наиболее мощных особенностей Swift.
Константы и переменные
Константы и переменные связывают имя (например, maximumNumberOfLoginAttempts или welcomeMessage ) со значением определенного типа (например, число 10 или строка «Hello» ). Значение константы не может быть изменено после его установки, тогда как переменной может быть установлено другое значение в будущем.
Объявление констант и переменных
Этот код можно прочесть как:
В этом примере максимальное количество доступных попыток входа объявлено как константа, потому что максимальное значение никогда не меняется. Счетчик текущего количества попыток входа объявлен как переменная, потому что это значение должно увеличиваться после каждой неудачной попытки входа.
Вы можете объявить несколько констант или несколько переменных на одной строке, разделяя их запятыми:
Заметка
Аннотация типов
Вы можете добавить обозначение типа, когда объявляете константу или переменную, чтобы иметь четкое представление о типах значений, которые могут хранить константы или переменные. Написать обозначение типа, можно поместив двоеточие после имени константы или переменной, затем пробел, за которым следует название используемого типа.
Двоеточие в объявлении значит «. типа. «, поэтому код выше может быть прочитан как:
Теперь переменной welcomeMessage можно присвоить любое текстовое значение, без каких либо ошибок:
Вы можете создать несколько переменных одного типа в одной строке, разделенной запятыми, с одной аннотацией типа после последнего имени переменной:
Заметка
Редко когда вам понадобится обозначать тип на практике. Когда вы даете начальное значение константе или переменной на момент объявления, Swift всегда может вывести тип, который будет использовать в константе или переменной. Это описано в Строгая типизация и Вывод типов. В примере welcomeMessage выше, не было присвоения начального значения, так что тип переменной welcomeMessage указывается с помощью обозначения типа вместо того, чтобы вывести из начального значения.
Название констант и переменных
Вы можете использовать почти любые символы для названий констант и переменных, включая Unicode-символы:
Заметка
Если вам нужно объявить константу или переменную тем же именем, что и зарезервированное слово Swift, то вы можете воспользоваться обратными кавычками (`) написанными вокруг этого слова. Однако старайтесь избегать имен совпадающих с ключевыми словами Swift и используйте такие имена только в тех случаях, когда у вас абсолютно нет выбора.
Вы можете изменить значение переменной на другое значение совместимого типа. В примере ниже значение friendlyWelcome изменено с “Hello!” на “Bonjour!” :
В отличие от переменных, значение константы не может быть изменено, после того, как было установлено. Если вы попытаетесь его изменить, то будет выведена ошибка компиляции:
Печать констант и переменных
Вы можете напечатать текущее значение константы или переменной при помощи функции print(_:separator:terminator:) :
Swift использует интерполяцию строки для включения имени константы или переменной в качестве плейсхолдера внутри строки, что подсказывает Swift подменить это имя на текущее значение, которое хранится в этой константе или переменной. Поместите имя константы или переменной в круглые скобки, а затем добавьте обратный слеш ( \ ) перед открывающей скобкой:
Заметка
Все опции, которые вы можете использовать в интерполяции строки вы сможете найти в разделе «Интерполяция строк».
Комментарии
Используйте комментарии, чтобы добавить неисполняемый текст в коде, как примечание или напоминание самому себе. Комментарии игнорируются компилятором Swift во время компиляции кода.
Комментарии в Swift очень похожи на комментарии в C. Однострочные комментарии начинаются с двух слешей ( // ):
Вы также можете написать многострочные комментарии, которые начинаются со слеша и звездочки ( /* ) и заканчиваются звездочкой, за которой следует слеш ( */ ):
В отличие от многострочных комментариев в C, многострочные комментарии в Swift могут быть вложены в другие многострочные комментарии. Вы можете написать вложенные комментарии, начав многострочный блок комментариев, а затем, начать второй многострочный комментарий внутри первого блока. Затем второй блок закрывается, а за ним закрывается первый блок:
Вложенные многострочные комментарии позволяют закомментировать большие блоки кода быстро и легко, даже если код уже содержит многострочные комментарии.
Точки с запятой
В отличие от многих других языков, Swift не требует писать точку с запятой ( ; ) после каждого выражения в коде, хотя вы можете делать это, если хотите. Однако точки с запятой требуются, если вы хотите написать несколько отдельных выражений на одной строке:
Целые числа
Границы целых чисел
Вы можете получить доступ к минимальному и максимальному значению каждого типа целого числа с помощью его свойств min и max :
Тип значения этих свойств соответствует размеру числа (в примере выше этот тип UInt8 ) и поэтому может быть использован в выражениях наряду с другими значениями того же типа.
Заметка
Числа с плавающей точкой
Заметка
Double имеет точность минимум 15 десятичных цифр, в то время как точность Float может быть всего лишь 6 десятичных цифр. Соответствующий тип числа с плавающей точкой используется в зависимости от характера и диапазона значений, c которыми вы должны работать в коде. В случаях, где возможно использование обоих типов, предпочтительным считается Double.
Строгая типизация и Вывод типов
Поскольку Swift имеет строгую типизацию, он выполняет проверку типов при компиляции кода и отмечает любые несоответствующие типы как ошибки. Это позволяет в процессе разработки ловить и как можно раньше исправлять ошибки.
Проверка типов поможет вам избежать ошибок при работе с различными типами значений. Тем не менее, это не означает, что при объявлении вы должны указывать тип каждой константы или переменной. Если вы не укажете нужный вам тип значения, Swift будет использовать вывод типов, чтобы вычислить соответствующий тип. Вывод типов позволяет компилятору вывести тип конкретного выражения автоматически во время компиляции, просто путем изучения значения, которого вы ему передаете.
Благодаря выводу типов, Swift требует гораздо меньше объявления типов, чем языки, такие как C или Objective-C. Константам и переменным все же нужно присваивать тип, но большая часть работы с указанием типов будет сделана за вас.
Точно так же, если вы не указали тип для литерала с плавающей точкой, Swift делает вывод, что вы хотите создать Double :
Swift всегда выбирает Double (вместо Float ), когда выводит тип чисел с плавающей точкой.
Если объединить целые литералы и литералы с плавающей точкой в одном выражении, в этом случае тип будет выводиться как Double :
Литеральное значение 3 не имеет явного типа само по себе, так что соответствующий тип Double выводится из наличия литерала с плавающей точкой как часть сложения.
Числовые литералы
Числовые литералы могут быть написаны как:
Все эти литералы целого числа имеют десятичное значение 17 :
Литералы с плавающей точкой могут быть десятичными (без префикса) или шестнадцатеричными (с префиксом 0x ). Они всегда должны иметь число (десятичное или шестнадцатеричное) по обе стороны от дробной точки. Они также могут иметь экспоненту, с указанием в верхнем или нижнем регистре е для десятичных чисел с плавающей точкой, или в верхнем или нижнем регистре р для шестнадцатеричных чисел с плавающей точкой.
Все эти числа с плавающей точкой имеют десятичное значение 12.1875 :
Числовые литералы могут содержать дополнительное форматирование, чтобы их было удобнее читать. Целые числа и числа с плавающей точкой могут быть дополнены нулями и могут содержать символы подчеркивания для увеличения читабельности. Ни один тип форматирования не влияет на базовое значение литерала:
Преобразования числовых типов
Используйте Int для всех целочисленных констант и переменных в коде, даже когда они неотрицательны. Использование стандартного типа целых чисел в большинстве случаев означает, что ваши целочисленные константы и переменные будут совместимы в коде и будут соответствовать типу, выведенному из целочисленного литерала.
Используйте другие типы целых чисел, только если вам это действительно нужно, например, когда используются данные с заданным размером из внешнего источника, или для производительности, использования памяти или других важных оптимизаций. Использование типов с определенным размером в таких ситуациях помогает уловить случайное переполнение значения и неявно задокументированные данные, используемые в коде.
Преобразования целых чисел
Поскольку каждый числовой тип может хранить разный диапазон значений, в зависимости от конкретного случая вам придется обращаться к преобразованию числовых типов. Этот подход предотвращает скрытые ошибки преобразования и помогает сделать причину преобразования понятной.
Преобразования целых чисел и чисел с плавающей точкой
Преобразование между целыми числами и числами с плавающей точкой должно происходить явно:
Заметка
Псевдонимы типов
Псевдонимы типов полезны, когда вы хотите обратиться к существующему типу по имени, которое больше подходит по контексту, например, когда вы работаете с данными определенного размера из внешнего источника:
После того как вы один раз задали псевдоним типа, вы можете использовать псевдоним везде, где вы хотели бы его использовать
Логические типы
Логические значения очень полезны когда вы работаете с условными операторами, такими как оператор if :
Условные операторы, такие как оператор if детально рассматриваются в главе Управление потоком.
Строгая типизация Swift препятствует замене значения Bool на не логическое значение. Следующий пример выведет ошибку компиляции:
Тем не менее, альтернативный пример ниже правильный:
Как в других примерах строгой типизации в Swift, этот подход предотвращает случайные ошибки и гарантирует, что замысел определенной части кода понятен.
Кортежи
Кортежи группируют несколько значений в одно составное значение. Значения внутри кортежа могут быть любого типа, то есть, нет необходимости, чтобы они были одного и того же типа.
В данном примере (404, «Not Found») это кортеж, который описывает код HTTP статуса. Код HTTP статуса — особое значение, возвращаемое веб-сервером каждый раз, когда вы запрашиваете веб-страницу. Код статуса 404 Not Found возвращается, когда вы запрашиваете страницу, которая не существует.
Чтобы передать код статуса, кортеж (404, «Not Found») группирует вместе два отдельных значения Int и String : число и понятное человеку описание. Это может быть описано как «кортеж типа (Int, String) «.
Вы можете разложить содержимое кортежа на отдельные константы и переменные, к которым можно получить доступ привычным способом:
Если вам нужны только некоторые из значений кортежа, вы можете игнорировать части кортежа во время разложения с помощью символа подчеркивания ( _ ):
В качестве альтернативы можно получать доступ к отдельным частям кортежа, используя числовые индексы, начинающиеся с нуля:
Вы можете давать имена отдельным элементам кортежа во время объявления:
Когда вы присвоили имя элементу кортежа, вы можете обратиться к нему по имени:
Заметка
Кортежи полезны для временной группировки связанных значений. Они не подходят для создания сложных структур данных. Если ваша структура данных, вероятно, будет выходить за рамки временной структуры, то такие вещи лучше проектируйте с помощью классов или структур, вместо кортежей. Для получения дополнительной информации смотрите главу Классы и структуры.
Опциональные типы (опционалы)
Опциональные типы используются в тех случаях, когда значение может отсутствовать. Опциональный тип подразумевает, что возможны два варианта: или значение есть, и его можно извлечь из опционала, либо его вообще нет.
Заметка
В C или Objective-C нет понятия опционалов. Ближайшее понятие в Objective-C это возможность вернуть nil из метода, который в противном случае вернул бы объект. В этом случае nil обозначает «отсутствие допустимого объекта». Тем не менее, это работает только для объектов, и не работает для структур, простых типов C, или значений перечисления. Для этих типов, методы Objective-C, как правило, возвращают специальное значение (например, NSNotFound ), чтобы указать отсутствие значения. Этот подход предполагает, что разработчик, который вызвал метод, знает, что есть это специальное значение и что его нужно учитывать. Опционалы Swift позволяют указать отсутствие значения для абсолютно любого типа, без необходимости использования специальных констант.
В приведенном ниже примере используется метод Int() для попытки преобразовать String в Int :
Мы можем установить опциональную переменную в состояние отсутствия значения, путем присвоения ему специального значения nil
Заметка
nil не может быть использован с не опциональными константами и переменными. Если значение константы или переменной при определенных условиях в коде должно когда-нибудь отсутствовать, всегда объявляйте их как опциональное значение соответствующего типа.
Если объявить опциональную переменную без присвоения значения по умолчанию, то переменная автоматически установится в nil для вас:
Заметка
nil в Swift не то же самое что nil в Objective-C. В Objective-C nil является указателем на несуществующий объект. В Swift nil не является указателем, а является отсутствием значения определенного типа. Устанавливаться в nil могут опционалы любого типа, а не только типы объектов.
Инструкция If и Принудительное извлечение
Если опционал имеет значение, он будет рассматриваться как «неравным» nil :
Более подробную информацию об инструкции if можно получить в главе Управление потоком.
Заметка
Привязка опционалов
Привязку опционалов для инструкции if можно писать как показано ниже:
Мы можем переписать пример possibleNumber сверху, используя привязку опционалов, а не принудительное извлечение:
Это может быть прочитано как:
«Если опциональный Int возвращаемый Int(possibleNumber) содержит значение, установи в новую константу с названием actualNumber значение, содержащееся в опционале.»
Заметка
Неявно извлеченные опционалы
Иногда, сразу понятно из структуры программы, что опционал всегда будет иметь значение, после того как это значение впервые было установлено. В этих случаях, очень полезно избавиться от проверки и извлечения значения опционала каждый раз при обращении к нему, потому что можно с уверенностью утверждать, что он постоянно имеет значение.
Эти виды опционалов называются неявно извлеченные опционалы. Их можно писать, используя восклицательный знак ( String! ), вместо вопросительного знака ( String? ), после типа, который вы хотите сделать опциональным.
Неявно извлеченные опционалы полезны, когда известно, что значение опционала существует непосредственно после первого объявления опционала, и точно будет существовать после этого. Неявно извлечённые опционалы в основном используются во время инициализации класса, как описано в разделе «Бесхозные ссылки и неявно извлеченные опциональные свойства».
Вы можете проверить не является ли неявно извлеченный опционал nil точно так же как вы проверяете обычный опционал:
Вы также можете использовать неявно извлеченный опционал с привязкой опционалов, чтобы проверить и извлечь его значение в одном выражении:
Заметка
Обработка ошибок
Вы используете обработку ошибок в ответ на появление условий возникновения ошибок во время выполнения программы.
В отличие от опционалов, которые могут использовать наличие или отсутствие значения для сообщения об успехе или неудаче функции, обработка ошибок позволяет определить причину сбоя, и, при необходимости, передать ошибку в другую часть вашей программы.
Когда функция обнаруживает условие ошибки, она выдает сообщение об ошибке. Тот, кто вызывает функцию, может затем поймать ошибку и среагировать соответствующим образом.
Вот пример того, как обработка ошибок может быть использована в ответ на различные условия возникновения ошибок:
Генерация, вылавливание и передача ошибок рассмотрены более подробно в главе Обработка ошибок.
Утверждения и предусловия
Используйте утверждения и предусловия для выражения допущений, которые вы делаете, пока пишете код, таким образом вы будете использовать их в качестве части вашего кода. Утверждения помогают находить вам ошибки и некорректные допущения, а предусловия помогают обнаружить проблемы в рабочем приложении.
В дополнение к сравниванию ваших ожиданий и действительности во время исполнения, и утверждения, и предусловия становятся полезными при использовании, так как они по сути становятся документацией к вашему коду. В отличии от Обработки ошибок, о которых мы с вами говорили чуть ранее, утверждения и предусловия не используются для ожидаемых ошибок, получив которые ваше приложение может восстановить свою работу. Так как ошибка, полученная через утверждение или предусловие является индикатором некорректной работы программы, то нет возможности отловить эту ошибку в утверждении, которое ее вызвало.
Использование утверждений и предусловий не являются заменой проектированию вашего кода таким образом, где вероятность того, что появятся некорректные условия будет маловероятна. Однако их использование для обеспечения правильности данных и состояния заставляет ваше приложение прекращать работу по причине ошибки более предсказуемо, если наступает некорректное состояние, которое помогает быстрее найти эту самую ошибку. Прекращение работы как только наступает некорректное состояние позволяет ограничить ущерб, который вызывается этим самым некорректным состоянием.
Различие между утверждениями и предусловиями в том, когда они проверяются: утверждения проверяются только в сборках дебаггера, а предусловия проверяются и в сборках дебаггера и продакшн сборках. В продакшн сборках условие внутри утверждения не вычисляется. Это означает, что вы можете использовать сколько угодно утверждений в процессе разработки без влияния на производительность продакшена.
Отладка с помощью утверждений
Сообщение утверждения можно пропускать по желанию, как в следующем примере:
Если код уже проверяет условие, то вы используете функцию assertionFailure(_:file:line:) для индикации того, что утверждение не выполнилось. Например:
Обеспечение предусловиями
Заметка
Вы можете использовать функцию fatalError (_:file:line:) во время прототипирования или ранней разработки для создания заглушек для функциональности, которая еще не реализована, написав fatalError («Unimplemented») в качестве реализации заглушки. Поскольку фатальные ошибки никогда не оптимизируются, в отличие от утверждений или предусловий, вы можете быть уверены, что выполнение кода всегда прекратится, если оно встречает реализацию заглушки.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.


