Программирование
Суть
Программирование — превращение задачи в исполняемую программу: модель данных, алгоритм, код на языке, сборка, отладка, поддержка. Код — лишь часть; не менее важны чтение чужого кода, тесты и умение объяснить решение. На собеседовании по этому вопросу обычно хотят услышать про парадигмы и про то, какой язык Swift.
Парадигмы, и как они выглядят в Swift
- Императивная / процедурная — последовательность команд, изменяющих состояние (
for,var, функции). - Объектно-ориентированная — данные и поведение объединены в объекты; классы, наследование, полиморфизм.
- Функциональная / декларативная — описываем что вычислить, а не как: чистые функции, неизменяемые данные,
map/filter/reduce. SwiftUI — декларативный UI. - Протокольно-ориентированная — главная для Swift: поведение описывается протоколами и расширениями, а не иерархией классов.
// Императивно: описываем КАК, шаг за шагом, с мутацией
var squares: [Int] = []
for n in 1...10 where n % 2 == 0 { squares.append(n * n) }
// Функционально: описываем ЧТО — чистые функции, без мутации
let squares2 = (1...10).filter { $0 % 2 == 0 }.map { $0 * $0 }
// Протокольно-ориентированно: поведение через протокол + расширение
protocol Shape { var area: Double { get } }
extension Shape { func describe() -> String { "area = \(area)" } }
struct Circle: Shape { var r: Double; var area: Double { .pi * r * r } }
Swift — мультипарадигменный: в одном файле могут сочетаться все четыре подхода.
Компилируемые vs интерпретируемые
- Компилируемые (Swift, C, Rust): исходник заранее переводится в машинный код; быстрее, ошибки типов — до запуска. На iOS только так: JIT для сторонних приложений запрещён.
- Интерпретируемые (Python, Ruby, JavaScript): код исполняет интерпретатор во время работы; медленнее, но гибче. Современные движки используют JIT — граница размыта.
Статическая vs динамическая типизация
- Статическая (Swift, Kotlin, TypeScript): тип переменной известен при компиляции. Swift — статический, строгий (без неявных преобразований), с выводом типов.
- Динамическая (Python, JavaScript, Objective-C в части сообщений): тип проверяется в рантайме; одна переменная может хранить значения разных типов.