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

Лекция 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 = None
print(len(name)) # RuntimeError: TypeError at runtime
// Swift: компилятор требует явной обработки Optional
var name: String? = nil
// print(name.count) // Ошибка компиляции: нужно развернуть Optional
if 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, полезно сопоставить два языка по ключевым характеристикам.

ХарактеристикаPythonSwift
ТипизацияДинамическаяСтатическая (с выводом типов)
ИсполнениеИнтерпретируемый (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)) # 5
print(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 вместо Int

4.2. Статическая vs динамическая типизация

В Python тип переменной определяется значением и может меняться:

x = 10 # int
x = "hello" # теперь str — допустимо

В Swift тип переменной фиксируется при объявлении (явно или через вывод типов):

var x = 10 // Int (выведен компилятором)
// x = "hello" // Ошибка компиляции: нельзя присвоить String переменной типа Int

5. Установка 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 update
sudo 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. Добавление в PATH
export PATH="$PWD/swift-6.1-RELEASE-ubuntu22.04/usr/bin:$PATH"
# 5. Проверка установки
swift --version

5.3. Альтернативный способ: swiftly

Утилита swiftly — менеджер версий Swift для Linux (аналогично pyenv для Python):

Окно терминала
# Установка swiftly
curl -L https://swiftlang.github.io/swiftly/swiftly-install.sh | bash
# Установка последней версии Swift
swiftly install latest
# Проверка
swift --version

5.4. Проверка работоспособности

После установки убедитесь, что Swift доступен:

Окно терминала
$ swift --version
Swift version 5.10 (swift-5.10-RELEASE)
Target: x86_64-unknown-linux-gnu

5.5. Установка Swift на Windows

Swift официально поддерживается на Windows 10/11 (64-битная архитектура). Компилятор swiftc, REPL и Swift Package Manager работают так же, как на Linux.

Способ 1: установщик с swift.org

  1. Перейдите на swift.org/download и выберите раздел Windows.
  2. Скачайте установщик (.exe) для нужной версии Swift (например, Swift 6.1).
  3. Запустите установщик и следуйте инструкциям. По умолчанию Swift устанавливается в каталог вида C:\Program Files\Swift и добавляется в переменную окружения PATH.
  4. Откройте новое окно 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

Рекомендуемая среда для данного курса:

  1. Установите VS Code.
  2. Установите расширение Swift (от Swift Server Work Group) из маркетплейса расширений.
  3. Расширение обеспечивает:
    • подсветку синтаксиса;
    • автодополнение кода (через SourceKit-LSP);
    • встроенную диагностику ошибок;
    • навигацию по коду;
    • интеграцию с отладчиком (LLDB).

6.3. Swift REPL

Swift предоставляет интерактивную оболочку (REPL — Read-Eval-Print Loop), аналогичную интерпретатору Python:

Окно терминала
$ swift
Welcome 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 + 2
4
>>> 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.py
python3 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 MyProject
swift package init --type executable
# Структура проекта:
# MyProject/
# ├── Package.swift ← описание пакета (аналог setup.py / pyproject.toml)
# └── Sources/
# └── main.swift ← точка входа
# Сборка и запуск
swift build
swift run

Файл Package.swift описывает зависимости и конфигурацию проекта:

5.10
import PackageDescription
let package = Package(
name: "MyProject",
targets: [
.executableTarget(name: "MyProject"),
]
)

7.4. Сводка способов запуска

СпособКомандаКогда использовать
REPLswiftЭксперименты, быстрые проверки
Скрипт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:

# Python
name = "Swift"
print(f"Язык: {name}") # Язык: Swift
print(1, 2, 3, sep="-") # 1-2-3
print("Без переноса", 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.0
print("Следующая версия: \(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 = 2014
version = 5.10
print(f"Язык {language} создан в {year} году.")
print(f"Текущая версия: {version}")
version = 6.0
print(f"Следующая версия: {version}")

Ключевое различие: в Swift разделение на let (константа) и var (переменная) явно выражает намерение программиста. Если значение не должно меняться, использование let гарантирует это на уровне компилятора. В Python подобной гарантии нет — любую переменную можно переназначить в любой момент.


11. Упражнения

  1. Установка и проверка. Установите Swift на свою систему Linux. Выполните команду swift --version и убедитесь, что вывод содержит номер версии Swift.

  2. Hello, World! Создайте файл hello.swift, в котором программа выводит "Hello, World!". Скомпилируйте его с помощью swiftc и запустите полученный бинарный файл.

  3. Визитная карточка. Напишите программу card.swift, которая объявляет константы с вашим именем, возрастом и городом, а затем выводит их в формате:

    Имя: Иван
    Возраст: 20
    Город: Москва

    Используйте интерполяцию строк (\(переменная)).

  4. Калькулятор. Напишите программу calc.swift, которая объявляет две целочисленные константы a и b, а затем выводит результаты сложения, вычитания, умножения и деления (целочисленного).

  5. REPL-эксперименты. Запустите Swift REPL (swift) и выполните следующее:

    • объявите константу типа String;
    • объявите переменную типа Int и измените её значение;
    • попробуйте присвоить строку целочисленной переменной и изучите сообщение об ошибке.
  6. Сравнение с Python. Напишите одну и ту же программу (вывод таблицы умножения для числа 7) на Python и на Swift. Сравните синтаксис и процесс запуска.


12. Вопросы для самопроверки

  1. В каком году был представлен Swift и кто является его создателем?
  2. Какие три ключевых принципа лежат в основе философии Swift?
  3. Чем отличается компилируемый язык от интерпретируемого? Приведите примеры каждого типа.
  4. Что такое статическая типизация и чем она отличается от динамической? Какие преимущества она даёт?
  5. На каких платформах (помимо macOS и iOS) может работать Swift?
  6. Какими способами можно запустить программу на Swift на Linux?
  7. В чём разница между let и var в Swift?
  8. Что такое интерполяция строк в Swift и как она записывается?
  9. Чем Swift REPL отличается от компиляции с помощью swiftc?
  10. Какова роль Swift Package Manager и когда его следует использовать?

Заключение

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

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