Лекция 1. Введение в Swift и его экосистему
1. История создания языка Swift
1.1. Предпосылки появления
До появления Swift основным языком разработки для платформ Apple являлся Objective-C — язык, созданный в начале 1980-х годов как расширение языка C с элементами объектно-ориентированного программирования, заимствованными из Smalltalk. Несмотря на свою мощь и выразительность, Objective-C обладал рядом недостатков:
- сложный и нетипичный синтаксис (квадратные скобки для вызова методов);
- отсутствие встроенных средств безопасной работы с памятью;
- высокий порог входа для начинающих разработчиков;
- ограниченные возможности типовой системы по сравнению с современными языками.
К началу 2010-х годов индустрия программирования уже располагала примерами языков с мощной типовой системой, автоматическим управлением памятью и лаконичным синтаксисом (Rust, Kotlin, Scala), и потребность в подобном инструменте для экосистемы Apple стала очевидной.
1.2. Создание и развитие
- 2010 — Крис Латтнер (Chris Lattner), инженер Apple и создатель компиляторной инфраструктуры LLVM, начинает работу над новым языком программирования.
- Июнь 2014 — Apple официально представляет Swift на конференции WWDC (Worldwide Developers Conference). Язык позиционируется как замена Objective-C для разработки приложений под iOS и macOS.
- Сентябрь 2014 — выход Swift 1.0 вместе с Xcode 6.
- Декабрь 2015 — Apple выпускает Swift под лицензией Apache 2.0 и публикует исходный код на GitHub (репозиторий apple/swift). Это ключевое событие: Swift становится языком с открытым исходным кодом.
- 2016–2019 — активное развитие: Swift 3 (совместимость API), Swift 4 (кодирование и декодирование данных), Swift 5 (стабильность ABI).
- 2020–2024 — развитие модели конкурентности (async/await, акторы), серверной экосистемы и кроссплатформенной поддержки.
- Сентябрь 2024 — выход Swift 6.0 с включённой по умолчанию строгой проверкой конкурентности (strict concurrency checking), полной изоляцией данных и новыми возможностями типизированных throws.
- 2025 — выход Swift 6.1 с улучшениями Swift Package Manager, нового макро-API и расширенной поддержкой Linux/Windows.
1.3. Текущий статус
На момент данного курса актуальная стабильная версия — Swift 6.1. Язык активно развивается через открытый процесс Swift Evolution, в котором любой разработчик может предложить изменение языка через публичное обсуждение.
2. Философия языка Swift
Swift спроектирован вокруг трёх ключевых принципов:
2.1. Безопасность (Safety)
Swift стремится устранить целые классы ошибок на этапе компиляции:
- обязательная инициализация переменных — нельзя использовать переменную до присвоения значения;
- опциональные типы (Optionals) — явное указание на возможность отсутствия значения вместо неявного
null; - строгая типизация — компилятор проверяет совместимость типов;
- автоматическое управление памятью через ARC (Automatic Reference Counting).
Сравнение с Python:
# Python: переменная может быть None в любой моментname = Noneprint(len(name)) # RuntimeError: TypeError at runtime// Swift: компилятор требует явной обработки Optionalvar name: String? = nil// print(name.count) // Ошибка компиляции: нужно развернуть Optionalif let name = name { print(name.count) // Безопасный доступ}2.2. Скорость (Performance)
- Swift — компилируемый язык, транслируемый в машинный код через LLVM.
- Производительность сопоставима с C и C++ для вычислительных задач.
- В отличие от Python (интерпретируемого через CPython), Swift не требует виртуальной машины или интерпретатора во время выполнения.
2.3. Выразительность (Expressiveness)
- Лаконичный, читаемый синтаксис, вдохновлённый Python, Rust, Haskell и другими языками.
- Вывод типов (type inference): компилятор самостоятельно определяет типы во многих случаях.
- Поддержка нескольких парадигм: объектно-ориентированное, функциональное, протоколо-ориентированное программирование.
// Вывод типов: компилятор понимает, что numbers — это [Int]let numbers = [1, 2, 3, 4, 5]let doubled = numbers.map { $0 * 2 }print(doubled) // [2, 4, 6, 8, 10]3. Swift как кроссплатформенный язык
3.1. За пределами Apple
После открытия исходного кода в 2015 году Swift начал развиваться как кроссплатформенный язык. На сегодняшний день Swift официально поддерживается на следующих платформах:
| Платформа | Статус поддержки |
|---|---|
| macOS | Полная (основная) |
| Linux (Ubuntu, CentOS, Amazon Linux, Fedora) | Официальная |
| Windows | Официальная (с Swift 5.3+) |
| iOS, iPadOS, watchOS, tvOS, visionOS | Полная |
3.2. Серверная разработка
Swift активно используется для серверного программирования:
- Vapor — популярный веб-фреймворк на Swift;
- Hummingbird — легковесная альтернатива;
- Swift NIO — асинхронный сетевой фреймворк (аналог Netty для Java).
Серверные приложения на Swift компилируются в нативный код, что обеспечивает низкое потребление ресурсов и высокую производительность по сравнению с интерпретируемыми решениями (Python/Flask, Node.js).
3.3. Значение для студентов
В данном курсе мы работаем на Linux, что демонстрирует: Swift — это не только «язык для iPhone», а полноценный язык общего назначения, пригодный для системного программирования, серверной разработки, скриптинга и учебных задач.
4. Сравнение Swift и Python
Поскольку у вас есть опыт программирования на Python, полезно сопоставить два языка по ключевым характеристикам.
| Характеристика | Python | Swift |
|---|---|---|
| Типизация | Динамическая | Статическая (с выводом типов) |
| Исполнение | Интерпретируемый (CPython) | Компилируемый (LLVM) |
| Производительность | Относительно медленный | Высокая (на уровне C/C++) |
| Управление памятью | Сборщик мусора (GC) | ARC (подсчёт ссылок) |
| Null-безопасность | Нет (None) | Да (Optional) |
| Точка входа | Не требуется | Не требуется (top-level code) |
| Фигурные скобки | Нет (отступы) | Да { } |
| Точки с запятой | Не требуются | Не требуются |
| Многопоточность | GIL (ограничения) | Полная поддержка + async/await |
4.1. Компилируемый vs интерпретируемый
Python — интерпретируемый язык. Исходный код выполняется построчно интерпретатором CPython. Ошибки типов обнаруживаются только во время выполнения:
def add(a, b): return a + b
print(add(2, 3)) # 5print(add("2", 3)) # TypeError — ошибка только при запускеSwift — компилируемый язык. Компилятор swiftc преобразует исходный код в машинный код до выполнения. Ошибки типов обнаруживаются на этапе компиляции:
func add(_ a: Int, _ b: Int) -> Int { return a + b}
print(add(2, 3)) // 5// print(add("2", 3)) // Ошибка компиляции: нельзя передать String вместо Int4.2. Статическая vs динамическая типизация
В Python тип переменной определяется значением и может меняться:
x = 10 # intx = "hello" # теперь str — допустимоВ Swift тип переменной фиксируется при объявлении (явно или через вывод типов):
var x = 10 // Int (выведен компилятором)// x = "hello" // Ошибка компиляции: нельзя присвоить String переменной типа Int5. Установка Swift на Linux
5.1. Системные требования
Swift поддерживает следующие дистрибутивы Linux:
- Ubuntu 20.04, 22.04, 24.04
- CentOS 7, Amazon Linux 2
- Fedora 39+
Требования: 64-битная архитектура (x86_64 или aarch64), не менее 2 ГБ оперативной памяти.
5.2. Установка через swift.org toolchain
Официальный способ установки — скачивание набора инструментов (toolchain) с сайта swift.org:
# 1. Установка зависимостей (Ubuntu)sudo apt-get updatesudo apt-get install -y \ binutils \ git \ gnupg2 \ libc6-dev \ libcurl4-openssl-dev \ libedit2 \ libgcc-9-dev \ libpython3-dev \ libsqlite3-0 \ libstdc++-9-dev \ libxml2-dev \ libz3-dev \ pkg-config \ tzdata \ unzip \ zlib1g-dev
# 2. Скачивание toolchain (пример для Ubuntu 22.04, Swift 6.1)wget https://download.swift.org/swift-6.1-release/ubuntu2204/swift-6.1-RELEASE/swift-6.1-RELEASE-ubuntu22.04.tar.gz
# 3. Распаковкаtar xzf swift-6.1-RELEASE-ubuntu22.04.tar.gz
# 4. Добавление в PATHexport PATH="$PWD/swift-6.1-RELEASE-ubuntu22.04/usr/bin:$PATH"
# 5. Проверка установкиswift --version5.3. Альтернативный способ: swiftly
Утилита swiftly — менеджер версий Swift для Linux (аналогично pyenv для Python):
# Установка swiftlycurl -L https://swiftlang.github.io/swiftly/swiftly-install.sh | bash
# Установка последней версии Swiftswiftly install latest
# Проверкаswift --version5.4. Проверка работоспособности
После установки убедитесь, что Swift доступен:
$ swift --versionSwift version 5.10 (swift-5.10-RELEASE)Target: x86_64-unknown-linux-gnu5.5. Установка Swift на Windows
Swift официально поддерживается на Windows 10/11 (64-битная архитектура). Компилятор swiftc, REPL и Swift Package Manager работают так же, как на Linux.
Способ 1: установщик с swift.org
- Перейдите на swift.org/download и выберите раздел Windows.
- Скачайте установщик (
.exe) для нужной версии Swift (например, Swift 6.1). - Запустите установщик и следуйте инструкциям. По умолчанию Swift устанавливается в каталог вида
C:\Program Files\Swiftи добавляется в переменную окруженияPATH. - Откройте новое окно PowerShell или командной строки (cmd) и проверьте:
swift --versionСпособ 2: через winget
В PowerShell (с правами администратора при необходимости):
winget install Swift.ToolchainПосле установки перезапустите терминал и выполните swift --version.
Запуск программ на Windows
Команды те же, что и на Linux:
# Компиляцияswiftc hello.swift -o hello.exe
# Запуск исполняемого файла.\hello.exe
# Интерактивная оболочка (REPL)swiftВ PowerShell текущую директорию указывают явно: .\hello.exe. В cmd достаточно hello.exe.
Замечания: На Windows часть модуля Foundation может отличаться или быть ограничена (например, некоторые API работы с файловой системой). Учебные примеры из курса, ориентированные на Linux, в большинстве случаев работают и на Windows. Для продвинутой серверной разработки и полной совместимости с курсом предпочтительна Linux.
6. Среда разработки
6.1. Терминал
Минимальная и самая надёжная среда разработки на Linux — это текстовый редактор и терминал. Для написания кода на Swift подойдут nano, vim, micro или любой другой редактор. На Windows те же команды (swift, swiftc) выполняются в PowerShell или в командной строке (cmd); можно использовать VS Code со встроенным терминалом.
6.2. Visual Studio Code + расширение Swift
Рекомендуемая среда для данного курса:
- Установите VS Code.
- Установите расширение Swift (от Swift Server Work Group) из маркетплейса расширений.
- Расширение обеспечивает:
- подсветку синтаксиса;
- автодополнение кода (через SourceKit-LSP);
- встроенную диагностику ошибок;
- навигацию по коду;
- интеграцию с отладчиком (LLDB).
6.3. Swift REPL
Swift предоставляет интерактивную оболочку (REPL — Read-Eval-Print Loop), аналогичную интерпретатору Python:
$ swiftWelcome to Swift version 5.10.Type :help for assistance. 1> let greeting = "Привет, мир!"greeting: String = "Привет, мир!" 2> print(greeting)Привет, мир! 3> 2 + 2$R0: Int = 4 4> :quitСравнение с Python REPL:
$ python3>>> greeting = "Привет, мир!">>> print(greeting)Привет, мир!>>> 2 + 24>>> exit()REPL удобен для быстрых экспериментов и проверки отдельных выражений, но для написания программ используется компиляция.
7. Компиляция и запуск программ
7.1. Компилятор swiftc
Компилятор swiftc переводит файл с исходным кодом Swift в исполняемый бинарный файл:
# Создаём файл с программойecho 'print("Hello, World!")' > hello.swift
# Компилируемswiftc hello.swift -o hello
# Запускаем./hello# Вывод: Hello, World!Сравнение с Python:
# Python: интерпретация без явного этапа компиляцииecho 'print("Hello, World!")' > hello.pypython3 hello.py# Вывод: Hello, World!Ключевое различие: swiftc создаёт самостоятельный исполняемый файл, который не требует интерпретатора для запуска. Файл hello можно скопировать на другую машину с совместимой ОС и запустить без установки Swift.
7.2. Однокомандный запуск: swift
Для удобства Swift позволяет компилировать и запускать файл одной командой:
swift hello.swift# Вывод: Hello, World!Под капотом Swift всё равно компилирует код, но делает это автоматически и во временный файл.
7.3. Swift Package Manager (SPM)
Для проектов из нескольких файлов используется Swift Package Manager — встроенный менеджер пакетов и система сборки (аналог pip + setuptools в Python):
# Создание нового проектаmkdir MyProject && cd MyProjectswift package init --type executable
# Структура проекта:# MyProject/# ├── Package.swift ← описание пакета (аналог setup.py / pyproject.toml)# └── Sources/# └── main.swift ← точка входа
# Сборка и запускswift buildswift runФайл Package.swift описывает зависимости и конфигурацию проекта:
import PackageDescription
let package = Package( name: "MyProject", targets: [ .executableTarget(name: "MyProject"), ])7.4. Сводка способов запуска
| Способ | Команда | Когда использовать |
|---|---|---|
| REPL | swift | Эксперименты, быстрые проверки |
| Скрипт | swift file.swift | Одиночные файлы, учебные задачи |
| Компиляция | swiftc file.swift -o out | Создание бинарного файла |
| Пакетный менеджер | swift run | Проекты из нескольких файлов |
8. Первая программа: Hello, World!
8.1. Минимальная программа
Создайте файл hello.swift со следующим содержимым:
print("Hello, World!")Запуск:
swift hello.swiftВывод:
Hello, World!Обратите внимание: в отличие от многих компилируемых языков (C, Java), Swift не требует функции main() или определения класса. Код на верхнем уровне файла выполняется как точка входа — подобно Python.
8.2. Функция print()
Функция print() в Swift работает аналогично Python, но имеет расширенные параметры:
// Базовый выводprint("Привет!") // Привет!
// Вывод нескольких значенийprint("Сумма:", 2 + 3) // Сумма: 5
// Пользовательский разделительprint(1, 2, 3, separator: "-") // 1-2-3
// Управление завершающим символомprint("Без переноса", terminator: "")print(" строки") // Без переноса строки
// Интерполяция строк (аналог f-строк в Python)let name = "Swift"print("Язык: \(name)") // Язык: SwiftСравнение с Python:
# Pythonname = "Swift"print(f"Язык: {name}") # Язык: Swiftprint(1, 2, 3, sep="-") # 1-2-3print("Без переноса", end="")print(" строки") # Без переноса строки9. Комментарии и структура программы
9.1. Комментарии
Swift поддерживает три вида комментариев:
// Однострочный комментарий
/* Многострочный комментарий */
/* Вложенные комментарии /* тоже допустимы в Swift */ в отличие от C/C++*/Важное отличие от Python: в Python многострочных комментариев нет (используются строки-литералы """), а в Swift многострочные комментарии могут быть вложенными, что удобно при временном отключении блоков кода.
9.2. Документирующие комментарии
Для автоматической генерации документации используется формат с тройным слэшем или блочный /** */:
/// Вычисляет сумму двух целых чисел./// - Parameters:/// - a: Первое слагаемое./// - b: Второе слагаемое./// - Returns: Сумма `a` и `b`.func add(_ a: Int, _ b: Int) -> Int { return a + b}9.3. Структура программы на Swift
Типичная структура простой программы на Swift:
// 1. Импорт модулей (при необходимости)import Foundation
// 2. Определение функций, структур, классовfunc greet(_ name: String) -> String { return "Привет, \(name)!"}
// 3. Код верхнего уровня (точка входа)let message = greet("студент")print(message) // Привет, студент!Модуль Foundation предоставляет базовые типы и утилиты (работа с датами, строками, файловой системой и др.). На Linux он доступен через Swift toolchain.
9.4. Точки с запятой
В Swift, как и в Python, точки с запятой в конце строк не обязательны. Однако они допустимы и необходимы, если вы размещаете несколько инструкций на одной строке:
let a = 1; let b = 2; print(a + b) // 3На практике размещение нескольких инструкций на одной строке не рекомендуется в силу ухудшения читаемости.
10. Пример: простая программа с переменными
Для закрепления напишем чуть более развёрнутую программу. Создайте файл intro.swift:
// Объявление константы (let — аналог неизменяемой переменной)let language = "Swift"let year = 2014
// Объявление переменной (var — изменяемая)var version = 5.10
// Вывод с интерполяцией строкprint("Язык \(language) создан в \(year) году.")print("Текущая версия: \(version)")
// Изменение переменнойversion = 6.0print("Следующая версия: \(version)")
// Попытка изменить константу — ошибка компиляции:// language = "Objective-C" // error: cannot assign to value: 'language' is a 'let' constantЗапуск и вывод:
$ swift intro.swiftЯзык Swift создан в 2014 году.Текущая версия: 5.1Следующая версия: 6.0Аналогичная программа на Python для сравнения:
language = "Swift"year = 2014version = 5.10
print(f"Язык {language} создан в {year} году.")print(f"Текущая версия: {version}")
version = 6.0print(f"Следующая версия: {version}")Ключевое различие: в Swift разделение на let (константа) и var (переменная) явно выражает намерение программиста. Если значение не должно меняться, использование let гарантирует это на уровне компилятора. В Python подобной гарантии нет — любую переменную можно переназначить в любой момент.
11. Упражнения
-
Установка и проверка. Установите Swift на свою систему Linux. Выполните команду
swift --versionи убедитесь, что вывод содержит номер версии Swift. -
Hello, World! Создайте файл
hello.swift, в котором программа выводит"Hello, World!". Скомпилируйте его с помощьюswiftcи запустите полученный бинарный файл. -
Визитная карточка. Напишите программу
card.swift, которая объявляет константы с вашим именем, возрастом и городом, а затем выводит их в формате:Имя: ИванВозраст: 20Город: МоскваИспользуйте интерполяцию строк (
\(переменная)). -
Калькулятор. Напишите программу
calc.swift, которая объявляет две целочисленные константыaиb, а затем выводит результаты сложения, вычитания, умножения и деления (целочисленного). -
REPL-эксперименты. Запустите Swift REPL (
swift) и выполните следующее:- объявите константу типа
String; - объявите переменную типа
Intи измените её значение; - попробуйте присвоить строку целочисленной переменной и изучите сообщение об ошибке.
- объявите константу типа
-
Сравнение с Python. Напишите одну и ту же программу (вывод таблицы умножения для числа 7) на Python и на Swift. Сравните синтаксис и процесс запуска.
12. Вопросы для самопроверки
- В каком году был представлен Swift и кто является его создателем?
- Какие три ключевых принципа лежат в основе философии Swift?
- Чем отличается компилируемый язык от интерпретируемого? Приведите примеры каждого типа.
- Что такое статическая типизация и чем она отличается от динамической? Какие преимущества она даёт?
- На каких платформах (помимо macOS и iOS) может работать Swift?
- Какими способами можно запустить программу на Swift на Linux?
- В чём разница между
letиvarв Swift? - Что такое интерполяция строк в Swift и как она записывается?
- Чем Swift REPL отличается от компиляции с помощью
swiftc? - Какова роль Swift Package Manager и когда его следует использовать?
Заключение
Swift — это современный, безопасный и высокопроизводительный язык программирования, который давно вышел за рамки экосистемы Apple. Его поддержка на Linux и открытый исходный код делают Swift отличным выбором для изучения принципов строго типизированных компилируемых языков, особенно если вы знакомы с Python и хотите расширить свой инструментарий.
В следующих лекциях мы подробнее рассмотрим систему типов Swift, управляющие конструкции, функции и начнём строить более сложные программы.