Данная книга содержит исчерпывающую информацию для всех желающих научиться программировать на замечательном языке Swift с целью создания собственных iOS-приложений (в том числе и для macOS, tvOS и watchOS) или программ для операционной системы Linux. В ходе чтения книги вы встретите не только теоретические сведения, но и большое количество практических примеров и заданий, выполняя которые вы углубите свои знания изучаемого материала.
В ходе долгого и плодотворного общения со многими из вас была выработана масса идей, благодаря которым новое издание стало по-настоящему полезным. В сравнении с предыдущим изданием данная книга содержит следующие изменения и дополнения:
— Весь материал актуализирован в соответствии со Swift версии 4.1 и Xcode 9.
— Добавлено большое количество нового учебного материала, в частности, связанного с практической разработкой приложений под iOS.
— Доработана глава, посвященная типу данных String.
— Учтены пожелания и замечания пользователей по оформлению и содержанию.
— Исправлены найденные опечатки. Выделен материал, предназначенный для начинающих программистов, в отдельные блоки, чтобы позволить читателям с опытом разработки на других языках не отвлекаться на ненужный им материал.
Книга состоит из пяти больших частей и одного приложения:
Часть I. Подготовка к разработке Swift-приложений. В первой части вы начнете ваше путешествие в мир Swift, выполните самые важные и обязательные шаги, предшествующие началу разработки собственных приложений. Вы узнаете, как завести собственную учетную запись Apple ID, как подключиться к программе apple-разработчиков, где взять среду разработки Swift-приложений, как с ней работать.
Часть II. Базовые возможности Swift. После знакомства со средой разработки Xcode, позволяющей приступить к изучению языка программирования, вы изучите базовые возможности Swift. Вы узнаете, какой синтаксис имеет Swift, что такое переменные и константы, какие типы данных существуют и как всем этим пользоваться при разработке программ.
Часть III. Основные средства Swift. Третья часть фокусируется на рассмотрении и изучении наиболее простых, но очень интересных средств Swift. О некоторых из них (например, о кортежах) вы, возможно, никогда не слышали, другие (например, массивы) вы, вероятно, использовали и в других языках.
Часть IV. Нетривиальные возможности Swift. В четвертой части подробно описываются приемы работы с наиболее мощными и функциональными средствами Swift. Материал этой части вы будете использовать с завидной регулярностью при создании собственных приложений в будущем. Также отличительной чертой данной части является большая практическая работа по созданию первого интерактивного приложения.
Часть V. Основы разработки приложений. В конце долгого и увлекательного пути изучения языка и создания некоторых простых приложений в Xcode Playground вам предстоит окунуться в мир разработки полноценных программ. Из этой части вы узнаете основы создания интерфейсов и работы программ в Xcode «под капотом». Все это в будущем позволит вам с успехом осваивать новый материал и создавать прекрасные проекты.
Приложение. Изменения и нововведения Swift 4.0. Если вы изучали какую-либо из предыдущих версий Swift, то информация, приведенная в данном приложении, позволит вам оперативно ознакомиться со всеми нововведениями и изменениями, которые принесла новая версия языка программирования.
Иногда бывает полезно указать определенные ограничения, накладываемые на типы данных универсального шаблона. В качестве примера мы уже рассматривали тип данных Dictionary, где для ключа существует требование: тип данных должен соответствовать протоколу Hashable.
Универсальные шаблоны позволяют накладывать определенные требования и ограничения на тип данных значения. Вы можете указать список типов, которым должен соответствовать тип значения. Если элементом этого списка является протокол (который также является типом данных), то проверяется соответствие типа значения данному протоколу; если типом является класс, структура или перечисления, то проверяется, соответствует ли тип значения данному типу.
Для определения ограничений необходимо передать перечень имен типов через двоеточие после заполнителя имени типа. Реализуем функцию, производящую поиск элемента в массиве и возвращающую его индекс (листинг 29.7).
ПРИМЕЧАНИЕ Для обеспечения функционала сравнения двух значений в Swift существует специальный протокол Equatable. Он обязывает поддерживающий его тип данных реализовать функционал сравнения двух значений с помощью операторов равенства (==) и неравенства (!=). Другими словами, если тип данных поддерживает этот протокол, то его значения можно сравнивать между собой.
Листинг 29.7
Параметр типа записывается как <T: Equatable>. Это означает «любой тип, поддерживающий протокол Equatable». В результате поиск в переданном массиве выполняется без ошибок, поскольку тип данных Int поддерживает протокол Equatable, следовательно, значения данного типа могут быть приняты к обработке.
Swift позволяет расширять описанные универсальные типы. При этом имена заполнителей, использованные в описании типа, могут указываться и в расширении.
Расширим описанный ранее универсальный тип Stack, добавив в него вычисляемое свойство, возвращающее верхний элемент стека без его удаления (листинг 29.8).
Листинг 29.8
Свойство topItem задействует заполнитель имени типа T для указания типа свойства. Данное свойство является опционалом, так как значение в стеке может отсутствовать. В этом случае возвращается nil.
При определении протокола бывает удобно использовать связанные типы, указывающие на некоторый, пока неизвестный, тип данных. Связанный тип позволяет задать заполнитель типа данных, который будет использоваться при заполнении протокола. Фактически тип данных не указывается до тех пор, пока протокол не будет принят каким-либо объектным типом. Связанные типы указываются с помощью ключевого слова associatedtype, за которым следует имя связанного типа.
Определим протокол Container, использующий связанный тип ItemType (листинг 29.9).
Листинг 29.9
Протокол Container (контейнер) может быть задействован в различных коллекциях, например в описанном ранее типе коллекции Stack. В этом случае тип данных, используемый в свойствах и методах протокола, заранее неизвестен.
Для решения проблемы используется связанный тип ItemType, который определяется лишь при принятии протокола типом данных. Пример принятия протокола к исполнению типом данных Stack представлен в листинге 29.10.
Листинг 29.10
Так как тип Stack теперь поддерживает протокол Container, в нем появилось три новых элемента: свойство, метод и сабскрипт. Ключевое слово typealias указывает на то, какой тип данных является связанным в данном объектном типе.
ПРИМЕЧАНИЕ Обратите внимание на то, что при описании протокола используется ключевое слово associatedtype, а при описании структуры — typealias.
Так как заполнитель имени использован в качестве типа аргумента item свойства append и возвращаемого значения сабскрипта, Swift может самостоятельно определить, что заполнитель T указывает на тип ItemType, соответствующий типу данных в протоколе Container. При этом указывать ключевое слово associatedtype не обязательно: если вы его удалите, то тип продолжит работать без ошибок.
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 20% по купону — Swift
В ходе долгого и плодотворного общения со многими из вас была выработана масса идей, благодаря которым новое издание стало по-настоящему полезным. В сравнении с предыдущим изданием данная книга содержит следующие изменения и дополнения:
— Весь материал актуализирован в соответствии со Swift версии 4.1 и Xcode 9.
— Добавлено большое количество нового учебного материала, в частности, связанного с практической разработкой приложений под iOS.
— Доработана глава, посвященная типу данных String.
— Учтены пожелания и замечания пользователей по оформлению и содержанию.
— Исправлены найденные опечатки. Выделен материал, предназначенный для начинающих программистов, в отдельные блоки, чтобы позволить читателям с опытом разработки на других языках не отвлекаться на ненужный им материал.
Структура книги
Книга состоит из пяти больших частей и одного приложения:
Часть I. Подготовка к разработке Swift-приложений. В первой части вы начнете ваше путешествие в мир Swift, выполните самые важные и обязательные шаги, предшествующие началу разработки собственных приложений. Вы узнаете, как завести собственную учетную запись Apple ID, как подключиться к программе apple-разработчиков, где взять среду разработки Swift-приложений, как с ней работать.
Часть II. Базовые возможности Swift. После знакомства со средой разработки Xcode, позволяющей приступить к изучению языка программирования, вы изучите базовые возможности Swift. Вы узнаете, какой синтаксис имеет Swift, что такое переменные и константы, какие типы данных существуют и как всем этим пользоваться при разработке программ.
Часть III. Основные средства Swift. Третья часть фокусируется на рассмотрении и изучении наиболее простых, но очень интересных средств Swift. О некоторых из них (например, о кортежах) вы, возможно, никогда не слышали, другие (например, массивы) вы, вероятно, использовали и в других языках.
Часть IV. Нетривиальные возможности Swift. В четвертой части подробно описываются приемы работы с наиболее мощными и функциональными средствами Swift. Материал этой части вы будете использовать с завидной регулярностью при создании собственных приложений в будущем. Также отличительной чертой данной части является большая практическая работа по созданию первого интерактивного приложения.
Часть V. Основы разработки приложений. В конце долгого и увлекательного пути изучения языка и создания некоторых простых приложений в Xcode Playground вам предстоит окунуться в мир разработки полноценных программ. Из этой части вы узнаете основы создания интерфейсов и работы программ в Xcode «под капотом». Все это в будущем позволит вам с успехом осваивать новый материал и создавать прекрасные проекты.
Приложение. Изменения и нововведения Swift 4.0. Если вы изучали какую-либо из предыдущих версий Swift, то информация, приведенная в данном приложении, позволит вам оперативно ознакомиться со всеми нововведениями и изменениями, которые принесла новая версия языка программирования.
Отрывок из книги. 29.3. Ограничения типа
Иногда бывает полезно указать определенные ограничения, накладываемые на типы данных универсального шаблона. В качестве примера мы уже рассматривали тип данных Dictionary, где для ключа существует требование: тип данных должен соответствовать протоколу Hashable.
Универсальные шаблоны позволяют накладывать определенные требования и ограничения на тип данных значения. Вы можете указать список типов, которым должен соответствовать тип значения. Если элементом этого списка является протокол (который также является типом данных), то проверяется соответствие типа значения данному протоколу; если типом является класс, структура или перечисления, то проверяется, соответствует ли тип значения данному типу.
Для определения ограничений необходимо передать перечень имен типов через двоеточие после заполнителя имени типа. Реализуем функцию, производящую поиск элемента в массиве и возвращающую его индекс (листинг 29.7).
ПРИМЕЧАНИЕ Для обеспечения функционала сравнения двух значений в Swift существует специальный протокол Equatable. Он обязывает поддерживающий его тип данных реализовать функционал сравнения двух значений с помощью операторов равенства (==) и неравенства (!=). Другими словами, если тип данных поддерживает этот протокол, то его значения можно сравнивать между собой.
Листинг 29.7
1 func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
2 for (index, value) in array.enumerated() {
3 if value == valueToFind {
4 return index
5 }
6 }
7 return nil
8 }
9 var myArray = [3.14159, 0.1, 0.25]
10 let firstIndex = findIndex(array: myArray, valueToFind: 0.1) // 1
11 let secondIndex = findIndex(array: myArray, valueToFind: 31)
// nil
Параметр типа записывается как <T: Equatable>. Это означает «любой тип, поддерживающий протокол Equatable». В результате поиск в переданном массиве выполняется без ошибок, поскольку тип данных Int поддерживает протокол Equatable, следовательно, значения данного типа могут быть приняты к обработке.
29.4. Расширения универсального типа
Swift позволяет расширять описанные универсальные типы. При этом имена заполнителей, использованные в описании типа, могут указываться и в расширении.
Расширим описанный ранее универсальный тип Stack, добавив в него вычисляемое свойство, возвращающее верхний элемент стека без его удаления (листинг 29.8).
Листинг 29.8
1 extension Stack {
2 var topItem: T? {
3 return items.isEmpty ? nil : items[items.count — 1]
4 }
5 }
Свойство topItem задействует заполнитель имени типа T для указания типа свойства. Данное свойство является опционалом, так как значение в стеке может отсутствовать. В этом случае возвращается nil.
29.5. Связанные типы
При определении протокола бывает удобно использовать связанные типы, указывающие на некоторый, пока неизвестный, тип данных. Связанный тип позволяет задать заполнитель типа данных, который будет использоваться при заполнении протокола. Фактически тип данных не указывается до тех пор, пока протокол не будет принят каким-либо объектным типом. Связанные типы указываются с помощью ключевого слова associatedtype, за которым следует имя связанного типа.
Определим протокол Container, использующий связанный тип ItemType (листинг 29.9).
Листинг 29.9
1 protocol Container {
2 associatedtype ItemType
3 mutating func append(item: ItemType)
4 var count: Int { get }
5 subscript(i: Int) -> ItemType { get }
6 }
Протокол Container (контейнер) может быть задействован в различных коллекциях, например в описанном ранее типе коллекции Stack. В этом случае тип данных, используемый в свойствах и методах протокола, заранее неизвестен.
Для решения проблемы используется связанный тип ItemType, который определяется лишь при принятии протокола типом данных. Пример принятия протокола к исполнению типом данных Stack представлен в листинге 29.10.
Листинг 29.10
1 struct Stack<T>: Container {
2 typealias ItemType = T
3 var items = [T]()
4 var count: Int {
5 return items.count
6 }
7 init(){}
8 init(_ elements: T...){
9 self.items = elements
10 }
11 subscript(i: Int) -> T {
12 return items[i]
13 }
14 mutating func push(item: T) {
15 items.append(item)
16 }
17 mutating func pop() -> T {
18 return items.removeLast()
19 }
20 mutating func append(item: T) {
21 items.append(item)
22 }
23 }
Так как тип Stack теперь поддерживает протокол Container, в нем появилось три новых элемента: свойство, метод и сабскрипт. Ключевое слово typealias указывает на то, какой тип данных является связанным в данном объектном типе.
ПРИМЕЧАНИЕ Обратите внимание на то, что при описании протокола используется ключевое слово associatedtype, а при описании структуры — typealias.
Так как заполнитель имени использован в качестве типа аргумента item свойства append и возвращаемого значения сабскрипта, Swift может самостоятельно определить, что заполнитель T указывает на тип ItemType, соответствующий типу данных в протоколе Container. При этом указывать ключевое слово associatedtype не обязательно: если вы его удалите, то тип продолжит работать без ошибок.
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 20% по купону — Swift