Введение в swift

Производительность

Это имен­но то, чего хоте­ли добить­ся раз­ра­бот­чи­ки Swift — ско­рость рабо­ты про­грамм и выпол­не­ния кода. Как заяв­ля­ет Apple, Swift в 2,5 раза быст­рее Objective-C и в 8 раз быст­рее, чем Python 2.7.

Цель, к кото­рой стре­мят­ся раз­ра­бот­чи­ки язы­ка — сде­лать его быст­рее, чем С++, кото­рый часто при­зна­ёт­ся самым быст­рым язы­ком программирования.

Надо ли вам, что­бы про­грам­ма была мол­ние­нос­ной? В иде­а­ле — да, но не все­гда ради это­го нуж­но пере­хо­дить на новый язык про­грам­ми­ро­ва­ния. Если про­грам­мой поль­зу­ет­ся неболь­шое чис­ло людей, а зада­ча некри­тич­ная, то повы­ше­ние ско­ро­сти может быть не так замет­но. А вот пере­пи­сы­ва­ние про­грам­мы на новом язы­ке может быть болез­нен­ным. Так что ско­рость — не все­гда самоцель.

Booleans¶

Swift has a basic Boolean type, called . Boolean values are referred to as logical, because they can only ever be true or false. Swift provides two Boolean constant values, and :

  1. let orangesAreOrange = true
  2. let turnipsAreDelicious = false

The types of and have been inferred as from the fact that they were initialized with Boolean literal values. As with and above, you don’t need to declare constants or variables as if you set them to or as soon as you create them. Type inference helps make Swift code more concise and readable when it initializes constants or variables with other values whose type is already known.

Boolean values are particularly useful when you work with conditional statements such as the statement:

  1. if turnipsAreDelicious {
  2. print(«Mmm, tasty turnips!»)
  3. } else {
  4. print(«Eww, turnips are horrible.»)
  5. }
  6. // Prints «Eww, turnips are horrible.»

Conditional statements such as the statement are covered in more detail in Control Flow.

Swift’s type safety prevents non-Boolean values from being substituted for . The following example reports a compile-time error:

  1. let i = 1
  2. if i {
  3. // this example will not compile, and will report an error
  4. }

However, the alternative example below is valid:

  1. let i = 1
  2. if i == 1 {
  3. // this example will compile successfully
  4. }

The result of the comparison is of type , and so this second example passes the type-check. Comparisons like are discussed in Basic Operators.

Создание массива через литералы массива

Вы можете инициализировать массив с помощью литерала массива, который является быстрым способом писать одно или несколько значений как набор значений массива.

Литерал массива пишется в виде списка значений, разделенных запятыми и окруженными парой (квадратных) скобок:

В приведенном ниже примере создается массив под названием shoppingList для хранения String значений:

Переменная shoppingList объявлена как «массив из String значений», который записывается как . Поскольку для этого массива указан тип значения String, ему разрешено хранить только String значения. Здесь, массив shoppingList инициализирован двумя String значениями («Eggs» и «Milk»), написанными внутри литерала массива.

Заметка

Массив shoppingList объявлен как переменная ( с помощью var ), а не константа ( с помощью let ), поскольку много элементов добавляются в список покупок в примерах ниже.

В данном случае литерал массива содержит два String значения и больше ничего. Это подходит типу, который мы присвоили при объявлении переменной shoppingList ( массив который может хранить только String значения), и поэтому присвоение литерала массива разрешено как способ инициализации shoppingList двумя начальными элементами.

Благодаря выводу типов Swift, вы можете не писать тип для массива, который вы инициализируйте с помощью литерала массива, хранящего значения того же типа. Вместо этого, инициализация shoppingList может быть записана в сокращенной форме:

Поскольку все значения внутри литерала массива одинакового типа, Swift может вывести, что является правильным типом для переменной shoppingList.

Что такое опционалы?

Опционалы могут либо иметь значение, либо вовсе не иметь значения (в данном случае значение будет равно nil). Вам необходимо извлечь опционалы, чтобы безопасно их использовать.

На базовом уровне код Swift состоит из переменных и функций. Вы используете переменные для хранения информации. Функции выполняют определенные задачи в вашем коде.

Давайте рассмотрим ситуацию, когда опционалы могут быть полезны.

Предположим, что вы заполняете официальную форму, например, для получения кредита. В форме есть поля для вашего имени, адреса электронной почты и места для удостоверения личности с фотографией вашего лица.

Перед заполнением формы все поля пусты. После того, как вы заполнили форму, вы можете ввести или не ввести необходимую информацию для каждого из полей. Например, вы, возможно, не захотите указывать свой адрес электронной почты или возражаете против использования вашей личной фотографии.

Можно сказать, что поля формы не обязательны. Они могут содержать значение, например ваше имя, или вообще не содержать никакого значения.

Поле, которое не имеет значения имеет специальное обозначение – nil. Это означает «ничего» или «нет значения».

Если переменная не содержит значения, она должна быть объявлена через nil, независимо от типа переменной

Неважно при этом, является ли переменная строкой, целым числом, контроллером представления, кнопкой, изображением или объектом

В программировании может быть много сценариев, в которых опционалы будут полезными:

  • Преобразование из строки, например “123”, в целое число.
  • Свойство IBOutlet для View Controller, которое является nil перед инициализацией View Controller.
  • Свойства класса, которые будут объявлены как nil до тех пор, пока не будут получены значения из внешнего веб-сервиса или базы данных.

Функция Reduce

Предыдущий пример был простым и использовал лишь один функциональный метод. В этом разделе, вы попробуете реализовать более сложную логику с использованием функциональных методов.

Создайте новый плейграунд и ждите новое задание!

Своя функция Reduce

Ваша задача в этом разделе лишь немного сложнее. Возьмите четные числа от 1 до 10, и вычислите их сумму. Для этого вам понадобится функция reduce, которая принимает несколько входных значений и генерирует одно на выходе.

Я уверен, что вы с успехом справитесь и сами, но в любом случае ответ ниже! Добавьте следующую строку в ваш плейграунд:

В Assistant Editor будет следующий результат:

Императивный код, указанный выше, написан в том же ключе, что и код в предыдущем примере, с добавлением дополнительного цикла for-in.

Давайте посмотрим, как выглядит функциональный эквивалент!

Функциональная Reduce

Добавьте следующую строку в ваш плейграунд:

Вы увидите точно такой же результат:

Предыдущий раздел охватывал создание массива и использование filter. Конечным результатом этих двух операций является массив с пятью числами . Новым шагом в коде выше стало использование reduce.

reduce является чрезвычайно универсальным методом массивов и выполняет функцию однократно для каждого элемента, накапливая результаты.

Для того чтобы понять, как работает метод reduce, нужно посмотреть на его описание:

Первый параметр — это начальное значение типа U. В вашем текущем коде, начальное значение равно , и имеет тип Int (следовательно, U это в данном случае Int). Второй аргумент — это функция combine, и она выполняется один раз для каждого элемента массива.

combine принимает два аргумента: первый, типа U, является результатом предыдущего вызова combine, второй — значением элемента массива, с которым он объединен. Результат, возвращаемый reduce,  это значение, возвращаемое последним вызовом combine.

Давайте разберем все шаг за шагом.

В вашем коде, первая итерация reduce приводит к следующему:

Сначала total имеет значение , а первый элемент входного массива равен 2. Если мы просуммируем эти значения, то на выходе (result) получится 2.

Вторая итерация показана ниже:

Во второй итерации, входное значение равно значению предыдущей итерации и следующего элемента из входного массива. Объединение их приводит к 2 + 4 = 6.

Продолжаем проделывать тоже самое для всех элементов массива, что приводит к следующим вводам и выводам:

Обозначенное звездочкой число в правом нижнем углу — общий результат.

Это довольно простой пример, на практике же вы можете выполнять любые виды интересных и сильных преобразований с reduce. Ниже приведены несколько простых примеров.

Добавьте следующую строку в ваш плейграунд:

Этот код использует reduce, чтобы найти максимальное значение в массиве целых чисел. В этом случае результат весьма очевиден! Помните, что здесь total на самом деле просто максимальный результат max последней итерации reduce.

Если вы пытаетесь изо всех сил понять, как это работает, почему бы не создать еще одну таблицу, где вы вычислите вводы и выводы combine (т.е. замыкания) для каждой итерации?

Примеры, которые вы видели, все уменьшают массивы целых чисел до одиночных целочисленных значений. Конечно, у reduce есть два типа параметров, U и T и они могут быть разными, и, конечно, не должны быть интеджерами. Это означает, что вы можете уменьшить массив одного типа до совершенно другого типа.

Добавьте следующую строку в ваш плейграунд:

Это приводит к следующему выводу:

Этот пример понижает массив целых чисел до строки, указанной выше.

Немного практики и вы будете использовать reduce по-всякому! 

Задача

Можете ли вы использовать reduce для того, чтобы преобразовать массив digits в целое число, если массив ввода такой:

Ваш понижающий метод должен возвращать Int со значением 3141.

Магия Reduce

В предыдущем разделе, вы разработали свою собственную реализацию filter, что оказалось удивительно просто. Теперь вы увидите, что то же самое можно сделать и для reduce.

Добавьте следующий код в ваш плейграунд:

Код выше добавляет метод myReduce в Array, который имитирует встроенную функцию Array. Этот метод просто перебирает каждый элемента массива, вызывая на каждом этапе combiner.

Чтобы это проверить, замените один из методов reduce в вашем плейграунде на myReduce.

Вы, наверное, на этом этапе думаете о том, почему вам должно хотеться реализовать filter или reduce? Ответ: “А и не должно хотеться!”

Но тем не менее, вы можете захотеть расширить использование функциональной парадигмы в Swift и реализовать собственные функциональные методы

Видеть и понимать, насколько это легко реализовывать такие действенные методы, как reduce, очень важно и нужно

Сложность обучения Swift

Swift является безопасным языком, который позволит огородить вас от большинства ошибок в процессе программирования. Он подскажет, где находится ошибка и почему не компилируется программа. Но с другой стороны, тут кроется жесткая типизация. Язык от Apple не прощает ошибок.

На данный момент существует небольшое количество документации, по сравнению с другими языками. Но это можно обусловить тем, что язык совсем недавно увидел свет и стал Open Source проектом, ведь на момент релиза его могли использовать только те разработчики, у которых была активная подписка Apple Developer Program.

Еще раньше можно было сказать, что Swift не очень популярен и для него существует малое количество сторонних библиотек и расширений, но сейчас это совершенно не так. На GitHub и просторах интернета находятся десятки отличных решений от сторонних разработчиков, которые помогут усовершенствовать Ваш проект.

БЕСПЛАТНЫЕ КУРСЫ

Название курса

Школа

Срок обучения

SwiftBook

29 лекций

SwiftBook

42 лекции

Udemy

78 лекций

Udemy

48 лекций

ОСНОВЫ ПРОГРАММИРОВАНИЯ – Перейти на сайт

Информация о курсе

Неплохой базовый курс по Swift с нуля. Школа предлагает пройти бесплатно 29 лекций, длительность которых варьируется от 1 до 5 минут. На официальном сайте опубликована программа обучения, поэтому вы можете просматривать только интересные вам уроки.

Чему вы научитесь:

  • Узнаете о том, почему стоит изучать Свифт;
  • Работе с типами данных, константами и переменными;
  • Работе с базовыми операторами;
  • Разделению кода;
  • Работе с циклами, массивами, словарями;
  • Поиску ошибок.

Преимущества:

  • В конце каждого блока есть тесты;
  • Подробная программа на сайте;
  • Смотреть уроки можно в любое время.

Недостатки:

  • Нет обратной связи;
  • Некоторые темы объясняются сложным языком;
  • Новичкам может быть тяжело.

ГИД ПО ЯЗЫКУ SWIFT – Перейти на сайт

Информация о курсе

Из этого курса вы узнаете об основах языка и об азах программирования. В принципе, лекции можно посмотреть для того, чтобы понимать, нужно ли вам изучать Swift или же отдать предпочтение другому языку. Длина уроков – от 1 до 12 минут.

Чему вы научитесь:

  • Константам и переменным, типам данных;
  • Работе с базовыми операторами;
  • Словарям, массивам, множествам;
  • Кортежам и опционалам;
  • Импорту фреймворков и библиотек;
  • Новым фишкам Свифт.

Преимущества:

  • Подробная программа на официальном сайте;
  • Есть тесты после каждого блока;
  • Можно просматривать уроки в любое время.

Недостатки:

  • Нет обратной связи;
  • Нет сертификатов;
  • Сложная подача материала.

SWIFT 5: ОСНОВЫ (2019) – Перейти на сайт

Информация о курсе

В рамках бесплатного обучения, вам будет предоставлен доступ только к видеоматериалам. Если вы новичок и сфера разработки для вас в новинку, то лучше все-таки сделать выбор в пользу платного обучения с возможностью получать обратную связь от авторов.

Чему вы научитесь:

  • Азам теории программирования;
  • Переменным и константам;
  • Работе с циклами и условными конструкциями;
  • Объектно-ориентированному программированию;
  • Протокол-ориентированному программированию.

Преимущества:

  • Большое количество материала;
  • Подробная программа на официальном сайте.

Недостатки:

  • Низкое качество видео и звука;
  • Нет обратной связи;
  • Новичкам будет сложно.

SWIFT 5 И ПРИЛОЖЕНИЯ ПОД IOS И MACOS – Перейти на сайт

Информация о курсе

Закончив обучение на этом курсе, вы научитесь созданию графических приложений для iOS и macOS. Рекомендую перед обучением ознакомиться с программой на официальном сайте и изучить отзывы. Также отмечу, что бесплатные лекции от Udemy не предполагают получения обратной связи от преподавателей.

Чему вы научитесь:

  • Работе с Xcode;
  • Целям распространения и видам ошибок;
  • Адаптивному дизайну;
  • Работе с коллекциями Foundation;
  • Рисованию с помощью draw;
  • Работе с данными и тестированию.

Преимущества:

  • Много полезной информации;
  • Доступ в любое время;
  • Можно смотреть с мобильных устройств.

Недостатки:

  • Плохой звук и качество видео;
  • Нет обратной связи;
  • Не отработаны ораторские навыки автора.

Составные операторы присваивания

Составные операторы присваивания комбинируют оператор присваивания (=) с другим оператором. Например, оператор сложения-присваивания (+=) комбинирует в себе оператор добавления и оператор присваивания. Вы обозначаете левый входной параметр составного оператора как inout, потому что именно эта величина и будет изменена напрямую изнутри самой операторной функции.

Пример ниже реализует операторную функцию добавления-присваивания для экземпляров Vector2D:

Так как оператор сложения был определен ранее, то вам не нужно реализовывать процесс сложения здесь. Вместо этого оператор сложения-присваивания использует существующую операторную функцию сложения и использует ее для установки нового значения левому значению, как сумму левого и правого значений:

Заметка

Нет такой возможности перегрузить оператор присваивания (=). Только составные операторы могут быть перегружены. Тернарный оператор (a ? b : c) так же не может быть перегружен.

Общая характеристика языка Swift

Определение 1

Swift — язык программирования, используемый преимущественно для написания программ, работающих в операционных системах компании Apple (MacOS, iOS). Он пришел на смену также специализированному для этих платформ языку Objective C в середине 2010-х гг. и с тех пор прочно входит, наряду с Go и Rust, в группу популярных мощных языков нового поколения, заметно и уверенно теснящих старых флагманов (C++, Java).

Swift разрабатывался с учетом двух ключевых требований:

  • простота освоения;
  • ускорение разработки.

Swift, по сравнению с предшественником, обладает следующими особенностями:

  • низкая вероятность проблем, связанных с наличием в программах неинициализированных переменных;
  • размерности массивов строго определены;
  • значения nil (null) обрабатываются явным образом;
  • управление памятью осуществляется автоматически, в частности исключены ситуации, когда возможно ее переполнение.

Swift содержит в себе такие новшества, присущие новым языкам программирования, как замыкания, кортежи, дженерики, множественные возвраты, встроенные шаблоны.

Перечисленные преимущества избавляют программиста от многих рутинных операций, позволяют снизить количество аварий и конфликтных ситуаций в коде, сосредоточиться на решении прикладной задачи. Приход Swift на смену Objective C существенно снизил время разработки приложений для платформ Apple.

По данным компании GitHub, Swift занимает место в первой дюжине рейтинга популярности языков программирования, а по данным Stack Overflow он является четвертым среди языков, которые активные разработчики называют самым любимым.

Рисунок 1. Фрагмент программы на Swift. Автор24 — интернет-биржа студенческих работ

Инструкции управления компиляторами

Инструкции управления компиляторами позволяют программе изменять аспекты поведения компилятора. В Swift есть две инструкции управления компиляторами: инструкция сборки конфигурации и инструкция управления строкой.

Блок условной компиляции

Блок условной компиляции позволяет коду быть условно скомпилированным в зависимости от значения одного или нескольких конфигураций сборки.

Каждый блок условной компиляции начинается с #if и заканчивается #endif. Простой блок условной компиляции выглядит так:

В отличие от условия инструкции if, блок условной компиляции оценивается во время компиляции. В результате инструкции компилируются и выполняются только, если блок условной компиляции будет true во время компиляции.

Условной компиляции может включать в себя литералы логического типа true и false, идентификатор, используемый с флагом командной строки -D, или любую платформу или функцию тестирования версий языка, перечисленных в таблице ниже.

Условие платформыДействительные аргументы
os()macOS, iOS, watchOS, tvOS, Linux
arch()i386, x86_64, arm, arm64
swift()>= с последующим указанием номером версии
canImport()Имя модуля
targetEnvironment()simulator

Номер версии функций swift() и compiler() для установки платформенных условий состоит из главного числа, опционального минорного числа, опционального числа патча и по аналогии далее. Все эти числа разделяются символом точки, без каких-либо пробелов. Версия для compiler() является версией компилятора, независимо от параметра версии Swift, переданного компилятору. Версия для swift() — это языковая версия, которая в данный момент компилируется. Например, если вы компилируете свой код, используя компилятор Swift 5 в режиме Swift 4.2, версия компилятора будет 5, а языковая версия — 4.2. С этими настройками следующий код печатает все три сообщения:

Аргументом для условия canImport() является имя модуля, который может отсутствовать. Это условие проверяет, возможно ли импортировать модуль, но фактически не импортирует его. Если модуль присутствует, условие версии возвращает true; в противном случае он возвращает false.

Условие версии targetEnvironment() возвращает true, когда код скомпилирован для симулятора; в противном случае он возвращает false.

Заметка

Функция тестирования платформы arch(arm) не возвращает true для устройств ARM 64. Функция тестирования платформы arch(i386) возвращает true, если код скомпилирован для 32-битного iOS симулятора.

Вы можете комбинировать условие компиляции, используя логические операторы &&, ||, и ! и использовать круглые скобки для группировки.

Аналогично инструкции if, вы можете добавить несколько веток условий для проверки различных условных компиляций. Вы можете добавить любое количество дополнительных ветвей через условия #elseif. Вы также можете добавить конечную дополнительную ветвь, используя условие #else. Условная компиляция, содержащий несколько ветвей, выглядит вот так:

Заметка

Каждая инструкция в теле блока условной компиляции анализируется, даже если он не компилируется. Тем не менее, есть исключение, когда блока условной компиляции включает в себя функцию тестирования версии языка. Инструкции анализируются, только если версия компилятора Swift соответствует той, что указана в функции тестирования версии языка. Это делается для гарантии того, что устаревший компилятор не будет разбирать синтаксис более поздних версий Swift.

Сопутствующие технологии

Apple совершила переход от использования статических библиотек к динамическим и добавила этот функционал в свой язык программирования, что означает его более быстрое развитие, чем самой iOS. Теперь разработчики с легкостью могут представить свое приложение вместе с написанными ими библиотеками. Раньше требовалось ждать нового релиза iOS, но теперь ситуация изменилась. Динамические библиотеки предоставляют возможность для более гибких улучшений и изменений в коде, чем когда-либо.

Swift более функциональный и доступный язык, который как и Objective-C поддерживает официальные фреймворки Cocoa и Cocoa Touch. В сети доступно множество открытых проектов, в том числе от таких крупных компаний как Airbnb, которые позволяют использовать все современные методы и решения при написании кода.

Язык Swift и платформы iOS и Mac OS

Последнее обновление: 25.12.2017

Устройства компании Apple являются признанным лидером в сфере информационных технологий. По последним данным доля iOS среди других мобильных операционных систем
колеблется в районе 15-20%, а доля Mac OSX среди настольных систем составляет по разным данным 15-20%. Подобное широкое распространение устройств от компании Apple рождает потребность в программном обеспечении для этих устройств.

Традиционно основным языком программирования под iOS и MacOS был Objective-C, однако 2 июня 2014 года на конференции разработчиков Apple WWDC 2014 был представлен новый и более удобный язык программирования — Swift. По сравнению с Objective-C Swift обладает следующими особенностями:

  • 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 предоставляет симуляторы для тестирования,
однако в некоторых отдельных случаях предпочтительнее тестировать на реальном смартфоне.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий