Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Swift

iOS с нуля вместе с Swift. В двух словах о Swift

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called iOS From Scratch With Swift.
iOS From Scratch With Swift: Creating Your First iOS Application
iOS From Scratch With Swift: More Swift in a Nutshell

Russian (Pусский) translation by Pavel Solodovnikov (you can also view the original English article)

Apple представила язык программирования Swift во время ежегодной конференции разработчиков в 2014 году, что было полной неожиданностью для сообщества разработчиков. Компания настроена серьезно по отношению к Swift, это не является очередным "игрушечным проектом". Цель Swift — стать основой для следующего поколения приложений на платформе Apple.

Требования

Программирование

Естественно, прояснить основные принципы в программировании и изучить Swift не представляется возможным в рамках одной или двух статей. Так что я предполагаю, что вы уже имеете некоторый опыт в программировании. Ruby, PHP или JavaScript являются хорошей отправной точкой для изучения Swift. Если у вас был ранее опыт web программирования, тогда после прочтения двух последующих статей у вас не должно возникнуть проблем в изучении основ Swift.

Swift

В двух последующих статьях я расскажу о "песочнице", новой фиче, появившейся в Xcode 6. Также мы рассмотрим основные структуры языка программирования Swift, такие как переменные, константы, типы данных, включая множества, массивы и словари.

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

Objective-C

Строго говоря, C и Objective-C не являются обязательными для изучения, если вы заинтересованы в разработке для iOS платформы. При этом, множество фреймворков, которые мы будем использовать для разработки iOS приложений, написаны на C и Objective-C. Так что я все равно так или иначе буду говорить о C и Objective-C. Однако же не стоит переживать, я позабочусь о том, чтобы вы могли без труда понимать всё, что необходимо для того, чтобы держать вас на тропе к вашей цели — становлению iOS разработчиком.

Xcode и Swift

На протяжении данной серии уроков мы будем использовать Xcode 7.1 и Swift 2.1. Если вы используете более раннюю версию Xcode, следует иметь ввиду, что вы не сможете работать со Swift 2.1. Swift продолжает стремительно меняться и синтаксис эволюционирует с каждой новой итерацией языка. Так что настоятельно рекомендуется все-таки использовать Xcode 7.1, который включает в себя Swift 2.1.

1. Песочница

В 2014 году Apple представила "песочницу" как часть Xcode 6. Песочница является отличным инструментом для изучения языка программирования Swift. С песочницей вы можете сфокусироваться непосредственно на коде, который вы пишете, вместо того, чтобы возиться с настройками проекта, файлами и папками.

Давайте же создадим песочницу, чтобы начать изучать основы Swift. Запустите Xcode 7.1 и выберите New > Playground... из пункта File в главном меню Xcode. Песочницы можно создавать под следующие платформы: OS X, iOS и tvOS. Выберите в пункте Platform значение iOS и назовите песочницу Swift in a Nutshell.

Create a Playground

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

Playground User Interface

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

Строка, начинающаяся с двух прямых слэшей, //, показывает, что эта строка — комментарий, который компилятор проигнорирует. Комментарии, занимающие несколько строк, начинаются с /* и заканчиваются */.

Xcode также добавил инструкцию для импортирования фреймворка UIKit. UIKit — самый важный фреймворк для iOS разработки. Он определяет строительные блоки, из которых строится любое iOS приложение. В Swift импортировать фреймворк можно, просто написав ключевое слово import, за которым следует имя фреймворка, то есть UIKit в данном случае.

Последняя строка может некоторым из вас напомнить о JavaScript. Используем ключевое слово var, чтобы объявить переменную str, и присвоим ей значение "Hello, playground". Этот пример демонстрирует одну из ключевых особенностей языка Swift — выведение типов.

Но пример, приведенный выше, может ввести в заблуждение. Можно подумать, что Swift является слабо-типизированным языком, но на самом деле это совсем не так. Переменная str имеет тип String. Swift достаточно умён, чтобы вывести тип переменной str, посмотрев на значение, которое мы собираемся ей присвоить.

Следующий пример является эквивалентным. Здесь мы явно указываем тип переменной str. Двоеточие, следующее за именем переменной, можно прочитать как имеет тип.

2. Переменные и Константы

Swift также определяет ключевое слово let. Данное ключевое слово используется для объявления константы. Язык программирования Swift поощряет использование констант всегда, когда это только возможно. Если значение переменной не изменяется на протяжении её времени жизни, то она должна быть константой. Как следует из названия, как только константе присвоено некоторое значение, оно уже не может быть изменено далее. Это может быть проиллюстрировано следующим примером.

The value of a constant cannot be changed

В примере выше, мы объявляем константу message и присваиваем ей значение. Несколькими строками ниже мы присваиваем новое значение константе message. Поскольку мы пытаемся изменить значение message, компилятор выдаёт ошибку. К счастью, компилятор в таких случаях предлагает автоматически исправить проблему, превращая константу message в переменную.

3. Типы данных

Swift определяет большое количество типов данных, но давайте взглянем на самые распространённые типы данных, с которыми мы будем далее встречаться.

Логические значения

Начнем с простого типа, Bool. Логические значения в Swift настолько же просты и легки в использовании, как и в других языках. Следующий пример демонстрирует, насколько это просто выглядит в Swift.

Числа

Числа представлены типами Int, UInt, Float и Double. Существуют и другие типы данных для хранения числовых значений, но перечисленные выше встречаются чаще всего. Эти типы данных идентичны тем, которые вы можете встретить в других языках программирования.

Поскольку Swift является строго-типизированным языком, вам наверняка придется иметь дело с преобразованиями типов время от времени. Например, нельзя перемножить между собой значения типов Int и Float. Давайте взглянем на следующий пример, чтобы лучше понять проблему.

Type Conversion

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

Converting a Number

Хотя может показаться, что мы приводим a к типу Float, это не то, что происходит на самом деле. Мы создаём или инициализируем значение типа Float, используя значение, хранящееся в a.

Есть два способа создать переменную или константу: явный синтаксис и синтаксис инициализатора. Константы a и b были созданы с использованием явного синтаксиса. Переменная str, которую мы обсуждали ранее, является еще одним примером явного синтаксиса.

Для того, чтобы создать значение типа Float из значения, сохранённом в a, мы используем синтаксис инициализатора. Мы создаем Float, используя имя типа, Float, за которым следуют круглые скобки, внутри которых передаётся a в качестве параметра.

Строки

Мы уже встречались с некоторыми строками в данном уроке. Строка — это не что иное, как просто последовательность символов. По сути, возможно получить доступ к коллекции символов как показано в примере ниже.

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

Коллекции

Стандартная библиотека языка Swift определяет три распространенных типа для коллекций, Array, Dictionary и Set. Эти типы-коллекции не требуют особых разъяснений, если вы знакомы с Objective-C или любым другим языком программирования. В некоторых языках словари известны как хэш-таблицы, а массивы — как списки. Идея, однако же, остается той же самой.

Массивы и словари инициализируются с помощью явного синтаксиса. Поскольку тип Set не имеет явного синтаксиса, мы используем синтаксис инициализатора для того, чтобы создать константу mySet.

Я уже упоминал ранее, что Swift — строго-типизированный язык и это также имеет свои последствия для типов-коллекций. Последующий пример иллюстрирует данный момент. Начнем с создания переменной arr1 типа [Int]. Это означает, что arr1 может содержать значения только типа Int.

Collection Types

Второе и третье выражения подтверждают это. Добавление целого числа допустимо, а вот если добавить строку, то возникнет ошибка компиляции. Компилятор попытается сконвертировать "Two" к типу Int, но не сможет этого сделать. В результате выйдет ошибка.

Следующий пример может запутать ещё больше. Почему компилятор не возмущается по поводу массива, который содержит значения разных типов? Причина может вас удивить. Константа arr2 имеет тип [AnyObject].

Any и AnyObject

Стандартная библиотека языка Swift определяет два специальных типа: Any и AnyObject. Тип Any может представлять значение любого типа, в то время как тип AnyObject может представлять собой любой класс или структуру. Если вы запутались, то это вполне нормально. Swift был спроектирован таким образом, чтобы быть строго-типизированным и складывается впечатление, что Any и AnyObject разрушают типобезопасность языка Swift.

Главной причиной введения типов Any и AnyObject является обратная совместимость. Я уже упоминал ранее, что большинство фреймворков, которые используются для разработки с помощью Cocoa, написаны на С и Objective-C. Objective-C определяет тип id, который может представлять любой объект. Для того, чтобы Swift и фреймворки Cocoa могли работать вместе, в стандартную библиотеку Swift были введены типы Any и AnyObject. Мы узнаем больше об этом, когда начнем работать с фреймворками Cocoa.

4. Классы и структуры

Классы

Если вы знакомы с объектно-ориентированным программированием, тогда вы должны быть уже знакомы с классами. Классы являются абсолютно обычными в Swift. Давайте взглянем на следующий пример, в котором мы определяем класс Boat с двумя свойствами, speed и lifeboats, и методом deployLifeboats().

Инициализация и изменение экземпляра класса Boat является совершенно элементарным, как вы можете видеть ниже. Вызов метода у экземпляра объекта также не является чем-то магическим. Основы работы с классами в Swift легки в понимании. Верно?

Структуры

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

Следующий пример демонстрирует наиболее важное различие между классами и структурами в Swift.

Difference Between Classes and Structures in Swift

Этот пример иллюстрирует тот факт, что классы передаются по ссылке, в то время как структуры передаются по значению. Что это значит? Мы инициализировали экземпляр класса Boat, присвоили его переменной boat1, и установили его свойство speed равным 11.0. Мы присвоили boat1 переменной boat2. Это означает, что boat2 теперь ссылается на boat1. И boat1, и boat2 указывают на один и тот же объект класса Boat. В результате если установить свойство speed у переменной boat2, то у переменной boat1 свойство speed также изменится.

Для структур это не так. Повторим те же самые шаги, используя структуру Ship. Однако конечный результат будет отличаться. Присваивая ship1 переменной ship2, значение ship1 будет скопировано и сохранено в ship2. Это означает, что ship1 и ship2 указывают на разные объекты, разные экземпляры структуры Ship. Это очень важный момент для понимания, так что убедитесь в том, что вы полностью его понимаете, прежде чем продолжить.

Следствия

Мы уже познакомились с наиболее распространёнными типами данных, определенными стандартной библиотекой языка Swift. Что я еще не упомянул в данном обсуждении, так это то, что каждый тип данных Swift, с которым мы имели дело до текущего момента, являлся структурой.

Каждый тип коллекций в Swift, например, является структурой. Каждый численный тип является структурой. Это важно знать и понимать, особенно если вы пришли из языка, который передаёт некоторые из этих типов по ссылке, такого как Ruby или Objective-C.

Больше различий

Существуют и другие различия, которые отличают классы и структуры в Swift между собой. Классы поддерживают наследование, в то время как структуры — нет. В следующем примере, мы определяем класс Speedboat, который наследуется от класса Boat. Класс Boat в данном случае является родительским классом, или суперклассом, для Speedboat.

Поскольку Boat является родительским классом для Speedboat, Speedboat наследует свойства и методы, определенные в классе Boat. Данный пример демонстрирует этот момент. Хотя реализация класса Speedboat пуста, экземпляр класса Speedboat, myBoat, имеет свойства speed и lifeboats, точно так же, как и метод deployLifeboats().

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

5. Опциональные типы

Опциональные типы являются неотъемлемой частью языка программирования Swift. Давайте выясним, что же такое опциональные типы и почему они так важны. Переменная должна быть инициализирована до того, как она может быть использована. Давайте взглянем на следующий пример, чтобы понять, что это значит.

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

Variable Not Initialized

Во многих языках программирования переменные имеют некоторое значение по умолчанию. В Objective-C, к примеру, строка в следующем отрывке кода равна nil.

Что такое "Опциональный тип"?

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

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

Принудительное разыменование

Один из способов получить значение опционального типа — с помощью принудительного разыменования опционала. Мы можем получить значение str, добавляя ! к имени переменной.

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

Forced Unwrapping an Optional Without a Value

Опциональное Связывание

Есть более безопасный путь получения значения из опционала. Следующий пример показывает, каким образом можно безопасно получить значение, хранящееся в переменной str, которая имеет тип String?.

Сначала мы проверяем, равняется ли str значению nil перед тем, как вывести её содержимое. В данном примере str не имеет значения. Это означает, что она не будет принудительно разыменована по случайности.

Есть и более элегантный подход, известный как опциональное связывание. В последующем примере мы присваиваем значение, сохранённое в опционале, во временную константу. Значение опционала str привязано к константе strConst и доступно в основном if блоке выражения if. Данный подход также работает и с конструкциями while.

Что такое nil?

Если вы пришли из языка вроде Objective-C, тогда вы определённо точно должны знать, что такое nil. В Objective-C nil является указателем на несуществующий объект. Swift определяет nil несколько иначе и это важно, чтобы вы понимали разницу.

В Swift nil означает отсутствие какого бы то ни было значения. В то время, как в Objective-C nil применим только к объектам, в Swift nil может быть использован для любого типа.

Не пропустили ли вы Точку с запятой?

Заметили ли вы, что мы не использовали точек с запятой в примерах в данной статье? В Swift нет необходимости использовать точку с запятой, поскольку компилятор достаточно умён, чтобы понять, где заканчивается одно выражение и начинается другое. Если же вы очень скучаете по точкам с запятой, ничего страшного, их можно добавлять по своему усмотрению. Однако же, стоит помнить, что официальное руководство к языку не рекомендует использовать символы точки с запятой.

Заключение

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

Если у вас остались какие-либо вопросы или комментарии, вы можете их оставить в комментариях ниже или связаться со мной через Twitter.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.