Перейти к содержимому

Курс: Язык программирования Swift

Целевая аудитория

Студенты с поверхностными знаниями Python. Знакомы с базовыми концепциями: переменные, циклы, функции, основы ООП.

Платформа

Linux. Все примеры и инструкции ориентированы на работу в терминале Linux. Xcode и Apple-специфичные фреймворки (UIKit, SwiftUI) не используются.

Цель курса

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


Структура курса (14 лекций)

Блок I. Основы языка (лекции 1–4)

Лекция 1. Введение в Swift и его экосистему

  • История создания Swift (Apple, 2014, open-source с 2015)
  • Философия языка: безопасность, скорость, выразительность
  • Swift как кроссплатформенный язык: поддержка Linux, Windows, серверная разработка
  • Сравнение с Python: компилируемый vs интерпретируемый, статическая vs динамическая типизация
  • Установка Swift на Linux (swift.org toolchain)
  • Среда разработки: терминал + VS Code (расширение Swift), Swift REPL
  • Компиляция и запуск: swiftc, swift run, REPL-режим (swift)
  • Первая программа: print("Hello, World!")
  • Комментарии, структура программы

Лекция 2. Переменные, константы и базовые типы данных

  • var и let — изменяемость и неизменяемость (сравнение с Python)
  • Базовые типы: Int, Double, Float, String, Bool, Character
  • Вывод типов (type inference) и явная аннотация типов
  • Строгая типизация и type safety — отличие от Python
  • Преобразование типов (явное, отсутствие неявного приведения)
  • Строковая интерполяция: \(variable) vs f-строки Python
  • Кортежи (Tuples) — группировка значений

Лекция 3. Операторы и управление потоком выполнения

  • Арифметические, логические, операторы сравнения
  • Оператор объединения по nil: ??
  • Операторы диапазона: ... и ..<
  • Условные конструкции: if, else, else if
  • Оператор switch — мощный pattern matching (сравнение с match/case Python 3.10+)
  • Циклы: for-in, while, repeat-while
  • Управляющие операторы: break, continue, fallthrough
  • guard — ранний выход

Лекция 4. Функции и замыкания

  • Определение функций, параметры и возвращаемые значения
  • Метки аргументов (argument labels) и имена параметров
  • Параметры по умолчанию, вариативные параметры (...)
  • inout-параметры — передача по ссылке
  • Функции как тип данных первого класса (сравнение с Python)
  • Замыкания (closures): синтаксис, захват значений
  • Сокращённый синтаксис замыканий: $0, $1, trailing closure
  • Сравнение с lambda в Python

Блок II. Коллекции и Optionals (лекции 5–6)

Лекция 5. Коллекции

  • Array — упорядоченный массив (аналог list в Python)
  • Set — множество (аналог set в Python)
  • Dictionary — словарь (аналог dict в Python)
  • Типизированные коллекции (отличие от Python)
  • Основные операции: добавление, удаление, поиск, итерация
  • Функциональные методы: map, filter, reduce, compactMap, flatMap
  • Сравнение с list comprehensions и встроенными функциями Python

Лекция 6. Optionals — безопасная работа с отсутствием значений

  • Концепция Optional: Type? — значение или nil
  • Зачем нужны Optionals (сравнение с None в Python)
  • Принудительное извлечение (force unwrapping): !
  • Опциональная привязка: if let, guard let
  • Опциональная цепочка (optional chaining): ?.
  • Оператор ?? (nil-coalescing)
  • Неявно извлечённые Optionals: Type!
  • Практические паттерны безопасной работы с Optionals

Блок III. Структуры данных и ООП (лекции 7–9)

Лекция 7. Структуры и классы

  • struct и class — два способа определения типов
  • Свойства: хранимые (stored) и вычисляемые (computed)
  • Наблюдатели свойств: willSet, didSet
  • Методы, методы типа (static, class)
  • Инициализаторы (init)
  • Value types vs Reference types — ключевое отличие struct от class
  • Сравнение с Python: в Python всё — reference type
  • Когда использовать struct, а когда class

Лекция 8. Наследование и полиморфизм

  • Наследование классов (только классы, не структуры)
  • Переопределение методов и свойств: override
  • Предотвращение переопределения: final
  • Инициализация при наследовании: designated и convenience инициализаторы
  • Приведение типов: is, as, as?, as!
  • Полиморфизм в Swift vs Python
  • Деинициализаторы: deinit

Лекция 9. Перечисления (Enumerations) и Pattern Matching

  • Определение enum в Swift (гораздо мощнее, чем Enum в Python)
  • Raw values и associated values
  • Методы и вычисляемые свойства в enum
  • Рекурсивные перечисления (indirect)
  • Pattern matching с switch и case let
  • where-условия в pattern matching
  • Использование перечислений для моделирования состояний

Блок IV. Протоколы, расширения и обобщения (лекции 10–11)

Лекция 10. Протоколы и расширения

  • Протоколы (Protocols) — аналог интерфейсов / абстрактных классов
  • Требования к свойствам и методам
  • Принятие протоколов структурами, классами, перечислениями
  • Протоколо-ориентированное программирование (POP) — философия Swift
  • Расширения (Extensions): добавление функциональности к существующим типам
  • Расширения протоколов — реализации по умолчанию
  • Сравнение с duck typing и ABC в Python

Лекция 11. Обобщения (Generics)

  • Зачем нужны Generics — обобщённый код без потери типобезопасности
  • Обобщённые функции и типы
  • Ограничения типов (type constraints)
  • Ассоциированные типы в протоколах (associatedtype)
  • where-условия в обобщениях
  • Стандартные обобщённые типы: Array<T>, Dictionary<K, V>, Optional<T>
  • Сравнение с типизацией в Python (TypeVar, Generic из typing)

Блок V. Продвинутые темы (лекции 12–14)

Лекция 12. Обработка ошибок и управление памятью

  • Модель обработки ошибок: throw, throws, do-catch, try, try?, try!
  • Определение собственных типов ошибок через Error
  • Сравнение с try/except в Python
  • Автоматическое управление памятью: ARC (Automatic Reference Counting)
  • Сильные, слабые (weak) и бесхозные (unowned) ссылки
  • Циклические ссылки и их предотвращение
  • Сравнение с garbage collection в Python

Лекция 13. Конкурентность и асинхронное программирование

  • Проблемы конкурентного выполнения
  • async / await — структурированная конкурентность в Swift
  • Task, TaskGroup — управление задачами
  • Акторы (actor) — безопасность данных в конкурентном коде
  • @Sendable и изоляция данных
  • Сравнение с asyncio в Python
  • Практические примеры: параллельная обработка данных, работа с файлами

Лекция 14. Итоговая лекция. Экосистема и практика

  • Swift Package Manager (SPM) — создание пакетов, управление зависимостями (аналог pip)
  • Структура проекта SPM: Package.swift, Sources/, Tests/
  • Обзор стандартной библиотеки Swift
  • Foundation на Linux: что доступно, а что нет (особенности реализации)
  • Серверный Swift: обзор фреймворка Vapor
  • Кроссплатформенная разработка: CLI-утилиты, серверные приложения
  • Код-стайл и лучшие практики
  • Подведение итогов курса
  • Рекомендации для дальнейшего изучения

Методические заметки

  • Ориентация на Linux — все примеры запускаются в терминале Linux; используется swiftc для компиляции и swift для REPL; Apple-специфичные фреймворки не рассматриваются
  • Параллели с Python — каждая тема сопровождается сравнением с аналогичной конструкцией в Python, чтобы студенты могли опереться на имеющиеся знания
  • Практические примеры — каждая лекция содержит примеры кода с пояснениями
  • Постепенное усложнение — от простых концепций к сложным, каждая лекция опирается на предыдущие
  • Акцент на безопасности типов — ключевое отличие Swift от Python, проходит красной нитью через весь курс