Оглавление
Читателю . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
О Swift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
О книге . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
О домашних заданиях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Исправления в пятом издании . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Для кого написана книга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Что нужно знать, прежде чем начать читать . . . . . . . . . . . . . . . . . . . . . . . . . 22
Структура книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Условные обозначения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Часть I. Подготовка к разработке Swift-приложений . . . 25
Глава 1. Подготовка к разработке в macOS . . . . . . . . . . . . . . . . . 26
1.1. Компьютер Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.2. Зарегистрируйтесь как Apple-разработчик . . . . . . . . . . . . . . . . . . . . . . 26
1.3. Установите Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.4. Введение в Хcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.5. Интерфейс playground-проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.6. Возможности playground-проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Глава 2. Подготовка к разработке в Linux . . . . . . . . . . . . . . . . . . . 39
Глава 3. Подготовка к разработке в Windows . . . . . . . . . . . . . . . 43
Часть II. Базовые возможности Swift . . . . . . . . . . . . . . . . 45
Глава 4. Отправная точка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1. Как компьютер работает с данными . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.2. Базовые понятия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.3. Введение в операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.4. Оператор инициализации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4  Оглавление
4.5. Переменные и константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.5. Инициализация копированием . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.6. Правила именования переменных и констант . . . . . . . . . . . . . . . . . . . 63
4.7. Возможности автодополнения и кодовые сниппеты . . . . . . . . . . . . . 64
4.8. Глобальные и локальные объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.9. Комментарии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.10. Точка с запятой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.11. Отладочная консоль и функция print(_:) . . . . . . . . . . . . . . . . . . . . . . 70
Глава 5. Фундаментальные типы данных . . . . . . . . . . . . . . . . . . . 77
5.1. Зачем нужны типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.2. Числовые типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.3. Строковые типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.4. Логический тип данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.5. Псевдонимы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.6. Дополнительные сведения о типах данных . . . . . . . . . . . . . . . . . . . . 108
Часть III. Контейнерные типы данных . . . . . . . . . . . . . . 112
Глава 6. Кортежи (Tuple) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.1. Основные сведения о кортежах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.2. Взаимодействие с элементами кортежа ......................... 116
6.3. Сравнение кортежей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Глава 7. Последовательности и коллекции . . . . . . . . . . . . . . . . . 122
7.1. Классификация понятий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
7.2. Последовательности (Sequence) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
7.3. Коллекции (Collection) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.4. Работа с документацией . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Глава 8. Диапазоны (Range) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
8.1. Оператор полуоткрытого диапазона . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
8.2. Оператор закрытого диапазона . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
8.3. Базовые свойства и методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Глава 9. Массивы (Array) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
9.1. Введение в массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
9.2. Тип данных массива . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
9.3. Массив — это value type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Оглавление  5
9.4. Пустой массив . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
9.5. Операции с массивами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
9.6. Многомерные массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
9.7. Базовые свойства и методы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . 149
9.8. Срезы массивов (ArraySlice) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Глава 10. Наборы (Set) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
10.1. Введение в наборы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
10.2. Пустой набор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
10.3. Базовые свойства и методы наборов . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Глава 11. Словари (Dictionary) . . . . . . . . . . . . . . . . . . . . . . . . . . 164
11.1. Введение в словари . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
11.2. Тип данных словаря . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
11.3. Взаимодействие с элементами словаря . . . . . . . . . . . . . . . . . . . . . . . 169
11.4. Пустой словарь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
11.5. Базовые свойства и методы словарей . . . . . . . . . . . . . . . . . . . . . . . . . 171
11.6. О вложенных типах данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Глава 12. Строка — коллекция символов (String) . . . . . . . . . . . 174
12.1. Character в составе String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
12.2. Графем-кластеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
12.3. Строковые индексы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
12.4. Подстроки (Substring) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Часть IV. Основные возможности Swift . . . . . . . . . . . . . . 183
Глава 13. Операторы управления . . . . . . . . . . . . . . . . . . . . . . . . . 184
13.1. Утверждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
13.2. Оператор условия if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
13.3. Оператор ветвления switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
13.4. Операторы повторения while и repeat while . . . . . . . . . . . . . . . . . . . 208
13.5. Оператор повторения for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
13.6. Оператор досрочного выхода guard . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Глава 14. Опциональные типы данных . . . . . . . . . . . . . . . . . . . . . 224
14.1. Введение в опционалы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
14.2. Извлечение опционального значения . . . . . . . . . . . . . . . . . . . . . . . . . 229
14.3. Проверка наличия значения в опционале . . . . . . . . . . . . . . . . . . . . . 232
6  Оглавление
14.4. Опциональное связывание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
14.5. Опциональное связывание как часть оптимизации кода . . . . . . . 235
14.6. Оператор объединения с nil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Глава 15. Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
15.1. Введение в функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
15.2. Входные аргументы и возвращаемое значение . . . . . . . . . . . . . . . . 244
15.3. Функциональный тип . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
15.4. Функция в качестве входного и возвращаемого значений . . . . . 253
15.5. Возможности функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Глава 16. Замыкания (closure) . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
16.1. Виды замыканий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
16.2. Введение в безымянные функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
16.3. Возможности замыканий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
16.4. Безымянные функции в параметрах . . . . . . . . . . . . . . . . . . . . . . . . . . 268
16.5. Пример использования замыканий при сортировке массива . . . 269
16.6. Захват переменных ........................................... 271
16.7. Замыкания передаются по ссылке . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
16.8. Автозамыкания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
16.9. Выходящие замыкания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
16.10. Каррирование функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Глава 17. Дополнительные возможности . . . . . . . . . . . . . . . . . . 281
17.1. Метод map(_:) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
17.2. Метод mapValues(_:) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
17.3. Метод filter(_:) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
17.4. Метод reduce(_:_:) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
17.5. Метод flatMap(_:) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
17.6. Метод zip(_:_:) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
17.7. Оператор guard для опционалов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Глава 18. Ленивые вычисления . . . . . . . . . . . . . . . . . . . . . . . . . . 290
18.1. Понятие ленивых вычислений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
18.2. Замыкания в ленивых вычислениях . . . . . . . . . . . . . . . . . . . . . . . . . . 291
18.3. Свойство lazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Оглавление  7
Часть V. Введение в разработку приложений . . . . . . . . . 293
Глава 19. Консольное приложение «Сумма двух чисел» . . . . . . 294
19.1. Обзор интерфейса Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
19.2. Подготовка к разработке приложения . . . . . . . . . . . . . . . . . . . . . . . . 301
19.3. Запуск приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
19.4. Код приложения «Сумма двух чисел» . . . . . . . . . . . . . . . . . . . . . . . . 305
Глава 20. Консольная игра «Отгадай число» . . . . . . . . . . . . . . . 309
20.1. Код приложения «Угадай число» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
20.2. Устраняем ошибки приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Часть VI. Нетривиальные возможности Swift . . . . . . . . . 314
Глава 21. Введение в объектно-ориентированное
программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
21.1. Экземпляры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
21.2. Пространства имен . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
21.3. API Design Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Глава 22. Перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
22.1. Синтаксис перечислений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
22.2. Ассоциированные параметры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
22.3. Вложенные перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
22.4. Оператор switch для перечислений . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
22.5. Связанные значения членов перечисления . . . . . . . . . . . . . . . . . . . 328
22.6. Инициализатор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
22.7. Свойства в перечислениях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
22.8. Методы в перечислениях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
22.9. Оператор self . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
22.10. Рекурсивные перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Глава 23. Структуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
23.1. Синтаксис объявления структур . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
23.2. Свойства в структурах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
23.3. Структура как пространство имен . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
23.4. Собственные инициализаторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
23.5. Методы в структурах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
8  Оглавление
Глава 24. Классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
24.1. Синтаксис классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
23.2. Свойства классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
24.3. Методы классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
24.4. Инициализаторы классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
24.5. Вложенные в класс типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Глава 25. Свойства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
25.1. Типы свойств . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
25.2. Контроль значений свойств . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
25.3. Свойства типа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Глава 26. Сабскрипты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
26.1. Назначение сабскриптов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
26.2. Синтаксис сабскриптов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Глава 27. Наследование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
27.1. Синтаксис наследования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
27.2. Переопределение наследуемых элементов . . . . . . . . . . . . . . . . . . . . 372
27.3. Превентивный модификатор final . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
27.4. Подмена экземпляров классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
27.5. Приведение типов ............................................ 377
Глава 28. Псевдонимы Any и AnyObject . . . . . . . . . . . . . . . . . . . 379
28.1. Псевдоним Any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
28.2. Псевдоним AnyObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Глава 29. Инициализаторы и деинициализаторы . . . . . . . . . . . . 382
29.1. Инициализаторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
29.2. Деинициализаторы ........................................... 389
Глава 30. Удаление экземпляров и ARC . . . . . . . . . . . . . . . . . . . 391
30.1. Уничтожение экземпляров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
30.2. Утечки памяти . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
30.3. Автоматический подсчет ссылок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Глава 31. Опциональные цепочки . . . . . . . . . . . . . . . . . . . . . . . . 399
31.1. Доступ к свойствам через опциональные цепочки . . . . . . . . . . . . . 399
31.2. Установка значений через опциональные цепочки . . . . . . . . . . . . 402
31.3. Доступ к методам через опциональные цепочки . . . . . . . . . . . . . . . 402
Оглавление  9
Глава 32. Расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
32.1. Вычисляемые свойства в расширениях . . . . . . . . . . . . . . . . . . . . . . . 405
32.2. Инициализаторы в расширениях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
32.3. Методы в расширениях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
32.4. Сабскрипты в расширениях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Глава 33. Протоколы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
33.1. Требуемые свойства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
33.2. Требуемые методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
33.3. Требуемые инициализаторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
33.4. Протокол в качестве типа данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
33.5. Расширение и протоколы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
33.6. Наследование протоколов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
33.7. Классовые протоколы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
33.8. Композиция протоколов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Глава 34. Разработка приложения в Xcode Playground . . . . . . . 417
34.1. Модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
34.2. Разграничение доступа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
34.3. Разработка интерактивного приложения . . . . . . . . . . . . . . . . . . . . . 422
Глава 35. Универсальные шаблоны . . . . . . . . . . . . . . . . . . . . . . . 436
35.1. Универсальные функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
35.2. Универсальные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
35.3. Ограничения типа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
35.4. Расширения универсального типа . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
35.5. Связанные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Глава 36. Обработка ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
36.1. Выбрасывание ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
36.2. Обработка ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
36.3. Отложенные действия по очистке . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Глава 37. Нетривиальное использование операторов . . . . . . . . 451
37.1. Операторные функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
37.2. Пользовательские операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
10  Оглавление
Часть VII. Введение в мобильную разработку . . . . . . . . 455
Глава 38. Разработка приложения под iOS . . . . . . . . . . . . . . . . . 456
38.1. Создание проекта MyName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
38.2. Interface Builder, Storyboard и View Controller . . . . . . . . . . . . . . . . 458
38.3. Разработка простейшего UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
38.4. Запуск приложения в эмуляторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
38.5. View Controller сцены и класс UIViewController . . . . . . . . . . . . . . 470
38.6. Доступ UI к коду. Определитель типа @IBAction . . . . . . . . . . . . . 472
38.7. Отображение всплывающего окна. Класс UIAlertController . . . 475
38.8. Изменение атрибутов кнопки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
38.9. Доступ кода к UI. Определитель типа @IBOutlet . . . . . . . . . . . . . 485
Глава 39. Паттерны проектирования при разработке
в Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
39.1. Паттерн MVC. Фреймворк Cocoa Touch . . . . . . . . . . . . . . . . . . . . . . 490
39.2. Паттерн Singleton. Класс UIApplication . . . . . . . . . . . . . . . . . . . . . . . 492
39.3. Паттерн Delegation. Класс UIApplicationDelegate . . . . . . . . . . . . . 493
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495