Введение в Swift
Язык Swift и платформы iOS и Mac OS
Устройства компании Apple являются признанным лидером в сфере информационных технологий. По последним данным доля iOS среди других мобильных операционных систем колеблется в районе 15-20%, а доля Mac OSX среди настольных систем составляет по разным данным 15-20%. Подобное широкое распространение устройств от компании Apple рождает потребность в программном обеспечении для этих устройств.
Swift является чистым объектно-ориентированным языком программирования
Простота, ясный и четкий синтаксис
Строгая типизированность. Каждая переменная имеет определенный тип
Автоматическое управление памятью
Однако при этом Swift полностью совместим с ранее написанными прикладными интерфейсами Cocoa API, для которых использовались C и Objective-C.
При этом Swift продолжает развиваться. 19 сентября 2017 года вышла версия 4.0, которая добавила новые возможности для разработки под iOS и Mac OS. В принципе каждый год выходят новые версии.
Swift является компилируемым языком программирования. То есть разработчик пишет исходный код и затем, используя компилятор, компилирует этот код в управляющую программу. Затем этот файл программы можно загрузить в AppStore и распространять среди других пользователей.
Что нужно для разработки для iOS?
В первую очередь необходима соответствующая операционная система Mac OS 10.12 Yosemite или выше. Без Mac OS практически невозможно скомпилировать программу. Данное обстоятельство сильно ограничивает возможности разработки, учитывая тот факт, что Mac OS может гарантированно работать лишь на компьютерах самой компании Apple (iMac, MacBook, MacBook Air, MacBook Pro), а также учитывая высокую стоимость этих самых компьютеров. Однако на обычном PC под управлением ОС Windows или ОС на базе Linux создавать приложения под iOS и Mac OS практически невозможно.
Существуют также варианты с виртуальными машинами, на которые установлена Mac OS, либо использование Хакинтош, однако работоспособность подобных вариантов не гарантирована.
Непосредственно для самой разработки нам потребуются инструменты языка Swift, текстовый редактор для написания кода, симуляторы iPhone и iPad для отладки приложения. Для всех этих и многих других функций разработки Apple предоставляет бесплатную среду разработки XCode.
Нужны ли реальные устройства iPhone или iPad для тестирования разрабатываемых приложений? По большому счету нет, так как XCode предоставляет симуляторы для тестирования, однако в некоторых отдельных случаях предпочтительнее тестировать на реальном смартфоне.
Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!]
Предисловие
Недавно Apple представила общественности достаточно важное изменение в разработке iOS приложений, анонсировав новый язык программирования Swift. Я принял решение: изучая этот язык пошагово, я буду в своих статьях рассказывать обо всём, что мне удалось найти. Это лишь первый пост из многих на эту тему, но я надеюсь, что вы решите изучать язык вместе со мной!
Весьма вероятно, что многие примеры кода, представленные в постах, будут позже изменены. Это отчасти потому, что мой стиль программирования – написать сейчас, чтобы проверить идею, а потом заняться рефакторингом, а также отчасти это потому, что для меня (как и для многих других) Swift – абсолютно новый язык программирования. Так что, скорее всего, как только я узнаю что-нибудь новое, ход этих уроков будет меняться.
Итак, я собираюсь начать с довольно простого приложения. Также я буду объяснять, как работает код. Готовы? Поехали…
UPD: Статья написана в соответствии с изменениями в XСode 6 Beta 5
Основы
в Swift будет заменена на эту
Для объявления констант используется ключевое слово let
В данном случае kSomeConstant неявно определяется как целое число. Если же вы хотите конкретизировать тип, то вы можете это сделать так:
Автор перевода рекомендует пользоваться вторым примером объявления констант. Довольно показательный пример описан в официальной документации:
В этом автор перевода солидарен с Helecta (см. соответствующий пост)
И массивы, и словари описываются с помощью []
Это ещё далеко не всё, однако я считаю, что эти основы достаточно важны для дальнейшего чтения учебника. Итак, давайте перейдём к Hello, World!
Hello, World!
В первую очередь, мы напишем самое простое приложение, которое только можно представить, чтобы начать работу — Hello, World!
Наше приложение будет делать только одно: печатать фразу «Hello, World!» в консоль. Для этого нам потребуется установленная IDE XCode, для скачивания которой необходима учётная запись разработчика. Если у вас есть аккаунт, то смело качайте с официального сайта XCode 6 beta 4, желательно это сделать до прочтения ниже описанного. 
Итак, вы установили свою копию IDE. Теперь давайте выведем «Hello, World!» на консоль.Этот пример не только демонстрирует простейшее приложение, которое можно написать, но и, что немаловажно, показывает, что среда разработки настроена правильно.
В XCode создайте проект с помощью шаблона приложения с одним видом («Single View Application»).
Убедитесь, что вы выбрали Swift в качестве языка приложения.
Теперь вы должны найти файл AppDelegate.swift в иерархии проекта. Внутри найдите следующую строку:
Замените эту строку на наш изумительный код:
Добавление Table View
Примечание:Я получил целую тонну вопросов о вышесказанном, т.к. многие люди сообщают о том, что у них не устанавливается табличный вид. Поэтому, я записал видео, поясняющее как работает подключение объектов Storyboard в коде. Для просмотра перейдите в полноэкранный режим и выберите опцию 720p, чтобы вы могли заметить всё, что вас интересует. Это будет немного отличаться от интерфейса XCode, но функционально всё работает также.
А теперь давайте углубимся в методы протоколов для табличного представления. Из-за использования UITableViewDataSource и UITableViewDelegate мы должны изменить определение класса.
Откройте файл и замените строку
Если вы нажмёте клавишу «Command» и кликните на один из этих протоколов, то увидите «обязательные» функции. Для табличного представления необходимы как минимум эти две:
Изменим наш класс View Controller путём добавления этих двух функций:
Первый метод возвращает количество строк в разделе. В нашем примере используется «магическое» число 10, однако вместо него, как правило, должна использоваться длинна контроллера массива. Наш же код умышленно упрощён.
При запуске приложения вы увидите восхитительный список ячеек с заголовками и подзаголовками, показывающие номера их строк. Это один из наиболее распространённых способов отображения данных в iOS, вы убедитесь, он вам ещё не раз пригодится. Увидеть полный текст кода вы можете на github.
В следующем посте мы исследуем использование API поиска iTunes для создания приложения, способного искать и отображать альбомы внутри iTunes Store.
Знакомьтесь, Swift!
2 июня на конференции WWDC 2014 Apple представила новый объектно-ориентированный язык программирования — Swift. Я думаю, многие уже успели посмотреть, что из себя представляет этот язык (Swift — нововведения), поэтому я не буду останавливаться на нововведениях. Я предлагаю создать простенький проект на языке Swift, чтобы понять на деле основные отличия от привычного Obj-C.
Подготовка
Структура
Обратите внимание на структуру, количество файлов теперь в 2 раза меньше, теперь нет необходимости в заголовочных файлах. Код, написанный в глобальной области используется в качестве точки входа для программы, так что больше не нужна функция main.
Вот как выглядит теперь AppDelegate:
Hello World
Запустите программу и вы увидите в консоли заветный Hello World. Вот так все просто.
Усложним
Немного усложним проект. Добавим любимый TableView.
Открываем Main.storyboard. Кстати, обратите внимание что для универсального приложения теперь по умолчанию создается не два storyboard, как было раньше, а всего лишь один. Количество симуляторов тоже увеличилось:
Находим в Object Library заветный Table View и переносим его на экран приложения. Растягиваем таблицу, чтобы она была на весь экран (необходимо, чтобы она совпадала с краями).
Дальше все делается как и раньше, нам нужно задать для таблицы dataSource и delegate. Для этого открываем Connection Inspector, от delegate тянем к объекту ViewController и аналогично для dataSource.
Во ViewController.swift нужно указать протоколы, которые нам понадобятся: UITableViewDataSource и UITableViewDelegate
Теперь это можно сделать так:
Вот эти две функции и необходимо добавить в наш ViewController.swift
Первая функция должна возвращать количество строк в таблице (Int):
А вторая функция возвращает ячейку таблицы:
В первой строчке создаем ячейку. Разберем запись подробней:
let означает, что мы создаем константу, а не переменную.
let cell: UITableViewCell сообщаем, что тип этой константы будет UITableViewCell. По идее, необязательно сообщать какой тип будет у константы или переменной. Программа будет прекрасно работать и так:
Но как мне кажется, лучше все-таки сообщать, Apple дает хороший пример почему:
Напомню, как мы создавали ячейку в Obj-C:
Не нужен больше alloc, Swift все делает самостоятельно. Все методы, которые начинались с init были убраны, и теперь инициализация происходит в стиле Swift (т.е MyClass()). Причем инициализаторы с with тоже были преобразованы, то что шло после with — стало первым аргументом в инициализаторе Swift.
Вот эта запись мне особенно сильно понравилась:
В Obj-C, чтобы сделать простую операцию конкатенацию строк, нужно было изгаляться следующим образом:
По мне, так это приятное изменение.
Скажем теперь мы захотели изменить цвет текста на стандартный фиолетовый. Сделать это можно аналогично тому как было в Obj-C, обратимся к методу класса
В итоге, получаем
Немного о playground
Playground — это площадка, где можно поэкспериментировать, и если понравиться перенести в основной проект.
Для того, чтобы создать playgroung выберете File->New->File:
Вот и все, можно экспериментировать. Например, я добавила ячейку таблицы, чтобы увидеть как она будет выглядеть.
Подробней почитать можно здесь https://developer.apple.com/.
Заключение
На первый взгляд, мне язык понравился. Довольно легко будет перейти от Obj-C на Swift, к тому же Swift прекрасно уживается с Obj-C. Количество кода уменьшилось в разы, читаемость при этом увеличилась. С памятью теперь вообще возиться не надо, все это делает Swift.
Лучшие среды разработки для Swift
В настоящее время существует большое количество языков, которые обычно используются для программирования. Некоторые, такие как Java, HMTL широко используются в рамках Windows работай. Однако мы также можем найти такой язык, как Swift, созданный Apple для разработки приложений, поэтому он широко используется в рамках устройств, принадлежащих компании Купертино, но с которыми вы также можете работать из Microsoft операционная система.
Для работы со Swift он создает среду IDE, которая представляет собой не что иное, как набор инструментов и средств, которые понадобятся программистам для разработки и проектирования программного обеспечения. Они делают это, предоставляя среду, в которой они могут писать и тестировать свой код. Поэтому, если мы хотим работать со Swift в macOS или Windows, нам понадобится инструмент, который предлагает нам эту совместимость.
Swift, язык программирования Apple
Swift разработан, чтобы упростить задачу по написанию и сопровождению программ для разработчика, поддерживая предполагаемые типы данных, чтобы сделать код более чистым и менее подверженным ошибкам. Этот язык программирования был задуман как замена языков на основе C, C ++ и Objective-C с лучшими результатами. Кроме того, он находится в постоянном развитии под строгим контролем за развитием языка.
Кросс-платформенные программы для использования Swift
Атом, один из самых популярных редакторов
Мы говорим о бесплатном текстовом редакторе с открытым исходным кодом для Windows, хотя его также можно использовать на других платформах, таких как macOS и Linux. Он разработан для использования всеми типами пользователей, будь то новички или продвинутые. Редактор позволит нам организовывать проекты по папкам, использовать несколько панелей одновременно и поддерживать такие языки, как C ++, PHP, JavaScript, HTML, а также Swift.
В настоящее время с Atom возможно автозаполнение кода Swift с помощью sourcekitten и сборка с помощью сборки Swift. Это также позволяет нам видеть список ошибок и предупреждений компиляции, устанавливать точки останова в коде Swift и запускать приложение, созданное в lldb. Кроме того, мы сможем проходить в точках останова. Кроме того, мы сможем взаимодействовать с lldb, используя его интерфейс командной строки.
Sublime Text, имеет собственный пакет для Swift
Это текстовый редактор кода, совместимый с широким спектром языков программирования, а также с языком разметки, что делает его одним из лучших вариантов для профессионалов. Он предлагает совместимость с популярными языками программирования, такими как HTML и CSS, а также со Swift для Apple, для которого у него есть хорошо известный пакет под названием Swift-Sublime-Пакет что мы должны установить через Пакетный контроль.
Его главный недостаток заключается в том, что это не самое интуитивно понятное приложение в мире, поэтому его использование предназначено особенно для самых продвинутых пользователей, поскольку оно способно повысить нашу производительность, как только нам удастся освоить его работу. Он имеет очень полезные функции, такие как определение стержней синтаксиса, выделение кода, выбор нескольких строк или выполнение разделенного редактирования и т. Д.
Visual Studio Code, возможность программирования Swift от Microsoft
У Microsoft также есть собственный редактор исходного кода под названием VS Code, который отвечает за совместимость с большим количеством языков программирования, таких как C #, C ++, HTML, Java, PHP, Python, SQL и также поддержка Swift за счет использования специального расширения. Он включает в себя списки завершения, справку по сигнатуре, фрагменты, краткую информацию и определение перехода. Чтобы работать в среде Swift, мы должны установить расширение для Swift в его палитре команд.
Этот бесплатный редактор имеет несколько интерактивных функций, таких как выделение синтаксиса и автозаполнение с помощью IntelliSense, которое предоставляет нам интеллектуальное завершение на основе типов переменных, определений импортированных функций и модулей, кода отладки, проверки различий и прямых фиксаций из редактора и т. Д. Кроме того, он включает встроенный элемент управления Git, подсветку синтаксиса, интеллектуальное завершение кода, фрагменты и рефакторинг кода.
Расписание в macOS
Xcode, инструмент, созданный Apple для разработки и компиляции
Не менее верно и то, что это непростое приложение и у него довольно высокая кривая обучения, но как только мы овладеваем им, мы получаем взамен очень мощный инструмент. Он также требует мощного компьютера и имеет проблемы с производительностью, поэтому он всегда был в поле зрения разработчиков. Кроме того, его использование стало практически необходимым, поскольку нам нужно, чтобы он мог компилироваться.
AppCode, специально разработанный для разработки на Swift
Сейчас мы говорим об IDE для разработки Swift, Objective-C, C и C + для iOS и macOS, построенной на платформе IntelliJ IDEA от JetBrains. Он выделяется рядом очень интересных функций. Например, пока мы пишем код, статический анализ или все поддерживаемые языки будут обрабатывать каждую ошибку или отображать предупреждение. По мере написания он также будет предлагать быстрые исправления. Мы сможем быстро переходить к любому классу, функции или символу в его кодировке, а также проверять только релевантное использование во время поиска.
Эта IDE поддерживает платформы XCTest, Quick, Kiwi, Catch, Boost.Test и Google Test. Предоставляет встроенное средство запуска тестов вместе с мощным пользовательским интерфейсом для исследования результатов тестирования. Кроме того, он включает единый интерфейс для самых популярных VCS, включая Subvercion, Git, GitHub, Mercurial и т. Д.
CodeRunner, легкая среда разработки для программирования с поддержкой Swift
Речь идет об облегченной среде IDE программирования для iOS и macOS, предназначенной для поддержки всех наиболее часто используемых языков программирования и мгновенного их выполнения. Приложение может запускать код на 25 языках, включая нечеткий поиск, заполнители с возможностью выбора табуляции и фрагменты документации. Он также имеет более 200 синтаксических режимов и множество расширенных функций редактирования.
С помощью этой IDE мы можем выполнять код на таких языках, как AppleScritpt, C, C #, Go, HTML, Java, JavaScript, PHP, Python и других. Это также позволяет нам добавить поддержку Swift. Кроме того, это позволяет нам запускать многофайловые проекты без необходимости ручной настройки.
Мы можем скачать CodeRunner из этой ссылке.
SCADE, программирование под Android и iOS
Мы можем скачать SCADE из здесь.
Как лучше всего программировать на Swift?
Как мы видим, у нас есть много возможностей для программирования на Swift, в основном в macOS, хотя мы также можем использовать некоторые многоплатформенные редакторы, так что можно будет программировать в Windows. Из всех доступных вариантов Xcode предлагает разработчикам все необходимое для создания приложений для Mac, IPad и iPhone. И дело в том, что это не только позволит нам программировать на Swift, но также станет возможным компилировать и отправлять наши приложения в App Store. Это то, что предлагают не все IDE, поэтому, безусловно, даже если мы воспользуемся другим из доступных вариантов в конце, нам придется пройти через Xcode.
Документация


Основы
Основы
Подобно 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.








